RabbitMQ消息的消費與持久化


作為消費者的客戶端要消費Rabbitmq的消息,首先要建立與它某個隊列的連接,具體連接時可指定隊列的BindingKey和關系的exchange標識,Rabbitmq判斷若已有隊列通過BindingKey與exchange標識關聯則允許消費者消費隊列的消息,否則新建一個隊列用指定的BindingKey與exchange關聯,獲取特定的消息。若果exchange是topic類型則也可用通配符‘#’獲取所有發到這個exchange的消息。

rabbitmq一個隊列類似一個消費群組,當有多個消費者都關注這個隊列消息時,它會將消息平均分配給各個消費者。若果不同應用消費者想要訂閱所有發到exchange的消息,則可以建不同的group消費。

rabbitmq默認消息、隊列、交換器(exchange)都不具有持久化的性質,如果應用需要持久化功能,那么在聲明時要配置好。首先交換器和隊列的聲明時要指定durable參數為true,這樣重啟后隊列和交換器都會恢復。然后消息在發送時要在properties中指定delivery_mode = 2,這樣服務重啟后隊列中的這種消息可以恢復。但消息的持久化不是一個強約束,涉及數據落地的時機及系統層面同步問題,若要盡可能提高消息的持久化有效性,可配置狀態反饋的confirm mode。

狀態反饋的目的是為了確認行為的結果。當你向exchange提交消息時,是否提交成功,是否送達到隊列,隊列中的消息是否被消費者正常消費等問題都要考慮。在AMQP中要確保消息業務可靠性只能使用事務,不過rabbitmq有些簡便的擴展機制如狀態確認可到達同樣的目的。

rabbitmq中狀態反饋分為發布狀態反饋和提取狀態反饋。具體發布消息時設置channel的confirm mode,這樣對持久化消息被投遞到一個持久化隊列成功並且把數據寫入磁盤時會給發送者一個狀態確認;在未關閉消息的ack機制情況下,當消息被consumer從隊列提取后,在未明確收到確認消息之前,隊列中的消息不會被刪除,而是變成等待確認狀態,當consumer反饋成功給隊列時,消息才會被刪除,若consumer反饋拒絕給隊列,則消息可能再被其它consumer提取。

https://www.zouyesheng.com/rabbitmq.html#toc11

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM