RabbitMq交換器和隊列

注:生產者和消費者都可以聲明一個交換器。如果嘗試聲明一個已經存在的交換器或者隊列,只要聲明的參數完全匹配現存的交換器或隊列,RabbitMq就可以聲明都不做,併成功返回。如果聲明的參數不匹配則會拋出異常。

 

exchangeDeclare()

exchange:交換器

type:交換器的類型,常見的如fanout、direct、topic

durable:設置是否持久化,true表示持久化。持久化可以將交換器存盤,在服務器重啓的時候不會丟失相關信息。

autoDelete:設置是否自動刪除。true表示自動刪除。自動刪除的前提是至少有一個隊列或者交換器與這和交換器綁定,之後所有與這個交換器綁定的隊列或者交換器都與此解綁。(不能錯誤的理解爲:當於此交換器連接的客戶端都斷開時)

internal:設置是否內置的。true表示是內置的交換器,客戶端程序無法直接發送消息到這個交換器中,只能通過交換器路由到交換器這種方式。

argument:其他的一些結構化參數,比如:alternate-exchange

 

備份交換器:

也可以稱之爲“備胎交換器”,生產者發送消息時,對應交換器未找到綁定的隊列,消息會默認丟失掉,可以使用備份交換器(建議類型爲fanout,如果爲其他的類型,rountingKey不匹配同樣會丟失)進行綁定,這樣未被路由的消息會存儲到備份交換器綁定的隊列上。(在聲明消息發送交換器時,增加參數alternate-exchange值爲備份交換器名來實現)

Map<String, Object> args = new HashMap<String, Object>();
args.put("alternate-exchange", "exchange_backup_ly_demo");
//聲明發送消息的交換器
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, args);
//聲明備份交換器
channel.exchangeDeclare("exchange_backup_ly_demo", "fanout", true, false, null);

//聲明發送消息的隊列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//將交換器與隊列通過路由鍵綁定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

//聲明備份交換器的隊列
channel.queueDeclare("queue_backup_ly_demo", true, false, false, null);
//將交換器與隊列通過路由鍵綁定
channel.queueBind("queue_backup_ly_demo", "exchange_backup_ly_demo", "");

 

 

queueDeclare()

queue:隊列名稱

durable:設置是否持久化。true表示持久化。持久化的隊列會存盤,在服務器重啓的時候可以保證不丟失相關信息。

exclusive:設置是否排他。true表示隊列是排他的。排他的隊列僅對“首次”聲明的連接可見,並在連接斷開時自動刪除。(這裏“首次”是指如果一個連接已經聲明瞭一個排他隊列,其他的連接是不允許建立同名的排他隊列)排他隊列是基於連接可見的,同一個連接的不同信道是可以同時訪問同一連接創建的排他隊列。即使隊列是持久化的,一旦連接關閉或者客戶端退出,該排他隊列都會被自動刪除 ,這種隊列適用於一個客戶端同時發送和讀取消息的應用場景。

autoDelete:設置是否自動刪除。true表示隊列自動刪除。前提是至少有一個消費者連接到這個隊列,之後所有與這個隊列連接的消費者都斷開時,纔會自動刪除。注意:生產者客戶端創建這個隊列,或者沒有消費者客戶端與這個隊列連接時,都不會自動刪除這個隊列。

arguments:其他的一些結構化參數,比如:x-message-ttl、x-expires、x-max-length、x-max-length-bytes等

 

注意:

1.生產者和消費者都能夠使用queueDeclare來聲明一個隊列,但是如果消費者在同一個信道上訂閱了另一個隊列,就無法再聲明隊列了。必須先取消訂閱,然後將信道置爲“傳輸”模式,之後才能聲明隊列。

2.RabbitMq的消息存儲在隊列中,交換器的使用並不真正消耗服務器的性能,而隊列會。如果要衡量RabbitMq當前的QPS只需看隊列的即可。

 

DLX(死信隊列):

1.消息在一個隊列中變成死信之後,它能被重新發送到另一個交換器中.

2.場景:

A.消息被拒絕(消費者拒絕消費此消息,Basic.Reject/Basic.Nack),並且設置requeue參數爲false

B.消息過期.

C.隊列達到最大長度

 

延遲隊列:

1.延遲隊列存儲的對象是對應的延遲消息(指當消息被髮送以後,並不想讓消費者立刻拿到消息,而是等待特定時間後,消費者才能拿到這個消息進行消費)

2.在AMQP協議中,或者RabbitMq本身沒有直接支持延遲隊列的功能,但是可以通過(DLX和TTL)模擬出延遲隊列的功能.

 

優先級隊列:

即具有高優先級的隊列具有高的優先權,優先級高的消息具備優先被消費的特權。

1.先通過設置隊列參數x-max-priority配置一個隊列的最大優先級

2.在發送消息中設置當前消息的優先級.(優先級默認最低爲0, 最高爲隊列設置的最大優先級)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章