RabbitMq交換器和佇列

2021-09-28 16:00:45 字數 2632 閱讀 3392

注:生產者和消費者都可以宣告乙個交換器。如果嘗試宣告乙個已經存在的交換器或者佇列,只要宣告的引數完全匹配現存的交換器或佇列,rabbitmq就可以宣告都不做,並成功返回。如果宣告的引數不匹配則會丟擲異常。

exchangedeclare()

exchange:交換器

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

durable:設定是否持久化,true表示持久化。持久化可以將交換器存檔,在伺服器重啟的時候不會丟失相關資訊。

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

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

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

備份交換器:

也可以稱之為「備胎交換器」,生產者傳送訊息時,對應交換器未找到繫結的佇列,訊息會預設丟失掉,可以使用備份交換器(建議型別為fanout,如果為其他的型別,rountingkey不匹配同樣會丟失)進行繫結,這樣未被路由的訊息會儲存到備份交換器繫結的佇列上。(在宣告訊息傳送交換器時,增加引數alternate-exchange值為備份交換器名來實現)

mapargs = new hashmap();

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, 最高為佇列設定的最大優先順序)

訊息佇列Rabbitmq的交換器型別

在rabbitmq中,生產者的訊息都是通過交換器來接收,然後再從交換器分發到不同的佇列中去,在分發的過程中交換器型別會影響分發的邏輯。rabitmq中的交換器有4種型別,分別為fanout direct topic headers四種,其中前三種較為常見,後面一種用的比較少。一般情況下交換器分發會先...

RabbitMQ之Direct交換器模式開發

dirtct交換器,即發布與訂閱模式,匹配規則為完全匹配。配置檔案 2 spring.rabbitmq.host 192.168.50.30 3 spring.rabbitmq.port 5672 4 spring.rabbitmq.username rabbit 5 spring.rabbitmq...

RabbitMQ 理解訊息通訊 交換器和繫結

當你想要將訊息投遞到佇列時,你通過把訊息傳送給交換器來完成。然後,根據確定的規則,rabbitmq將會決定訊息該投遞到哪個佇列,這些規則被稱為路由鍵 routing key 佇列通過路由鍵繫結到交換器,當你把訊息傳送到 伺服器時,訊息將擁有乙個路由鍵 即使是空的 rabbit也會將其和繫結使用的路由...