備份交換器是爲了實現沒有路由到隊列的消息,聲明交換機的時候添加屬性alternate-exchange,聲明一個備用交換機,通常聲明爲fanout類型,這樣交換機收到路由不到隊列的消息就會發送到備用交換機綁定的隊列中。python
使用Python的pika包,設置方式是在聲明exchange時,argument的參數中設置alternate-exchange的值,值爲備份交換機的名稱。spa
代碼示例:code
#!/usr/bin/env python import pika connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672)) channel = connection.channel() alternate_exchange = { 'alternate-exchange': 'backup_exchange' } channel.exchange_declare(exchange='topic_logs', exchange_type='topic', arguments=alternate_exchange) result = channel.queue_declare(exclusive=True) queue_name = result.method.queue binding_key = "info.*" channel.queue_bind(exchange='topic_logs', queue=queue_name, routing_key=binding_key) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body): print(" [x] %r:%r" % (method.routing_key, body)) channel.basic_consume(callback, queue=queue_name, no_ack=True) channel.start_consuming()
這樣設置聲明,若是交換機topic_logs沒有隊列來接收消息,則消息會被轉發到備份的exchange中。blog
arguments鍵 | 值 | 意義 |
x-message-ttl | 數字類型,標誌 | 標誌隊列中的消息存活時間,也就是說隊列中的消息超過了制定時間會被刪除 |
x-expires | 數字類型,標誌 | 隊列自身的空閒存活時間,當前的queue在指定的時間內,沒有consumer、basic.get也就是未被訪問,就會被刪除。 |
x-max-length和x-max-length-bytes | 數字 | 最大長度和最大佔用空間,設置了最大長度的隊列,在超過了最大長度後進行插入會刪除以前插入的消息爲本次的留出空間,相應的最大佔用大小也是這個道理,當超過了這個大小的時候,會刪除以前插入的消息爲本次的留出空間。 |
x-dead-letter-exchange和x-dead-letter-routing-key | 字符串 | 消息由於超時或超過限制在隊列裏消失,這樣咱們就丟失了一些消息,也許裏面就有一些是咱們作須要獲知的。而rabbitmq的死信功能則爲咱們帶來了解決方案。設置了dead letter exchange與dead letter routingkey(要麼都設定,要麼都不設定)那些由於超時或超出限制而被刪除的消息會被推進到咱們設置的exchange中,再根據routingkey推到queue中 |
x-max-priority | 數字 | 隊列所支持的優先級別,列如設置爲5,表示隊列支持0到5六個優先級別,5最高,0最低,固然這須要生產者在發送消息時指定消息的優先級別,消息按照優先級別從高到低的順序分發給消費者 |
alternate-exchange | 下面簡稱AE,當一個消息不能被route的時候,若是exchange設定了AE,則消息會被投遞到AE。若是存在AE鏈,則會按此繼續投遞,直到消息被route或AE鏈結束或遇到已經嘗試route過消息的AE。 |