rabbitmq confirm機制路由不到佇列無法觸發handleNack

快到中年發表於2020-10-28

 

以下是官網原話

https://www.rabbitmq.com/confirms.html#when-publishes-are-confirmed

When Will Published Messages Be Confirmed by the Broker?

For unroutable messages, the broker will issue a confirm once the exchange verifies a message won't route to any queue (returns an empty list of queues). If the message is also published as mandatory, the basic.return is sent to the client before basic.ack. The same is true for negative acknowledgements (basic.nack).

For routable messages, the basic.ack is sent when a message has been accepted by all the queues. For persistent messages routed to durable queues, this means persisting to disk. For mirrored queues, this means that all mirrors have accepted the message.

 

大意是說 訊息只要進入交換器 就會傳送 Ack  但是當訊息無法路由到佇列時  會在傳送basic.ack 之前 傳送一條basic.return 命令

所以 rabbitmq的confirm 模式 只是保證了訊息進入了rabbitmq 並且被處理,這個被處理 不一定保證進入佇列,還有可能被返回(設定了mandatory的時候)。只要交換器是存在的,在進入confirm模式後 就一定是返回Ack的 除非交換器不存在  才會返回Nack

 

我看 rabbitmq 實戰指南說的是 保證進入佇列 今天腦子一熱試了下 結果怎麼都是 ack 除非交換器不存在 一看官網,才知道到現在的版本 已經變成這樣了。

相關文章