1. 程式人生 > >消費RabbitMQ時的注意事項,如何禁止大量的訊息湧到Consumer,保證執行緒安全

消費RabbitMQ時的注意事項,如何禁止大量的訊息湧到Consumer,保證執行緒安全

按照官網提供的訂閱型寫法( Retrieving Messages By Subscription ("push API")) 我發現,RabbitMQ伺服器會在短時間內傳送大量的訊息給Consumer,然後,如果你沒有來得及Ack的話,那麼服務端會積壓大量的UnAcked訊息,而Consumer如果來不急處理也會處於假死(也可能引起程式崩潰)。


僅有兩個Channel,結果積壓了大量的UnAcked訊息。

這明顯是與我們的目的不一致,我們不能保證Consumer一 定會急時快速的處理訊息。所以這種方式帶來的後果就是Consmer崩潰後,UnAcked訊息又ReQueue,這肯定會消耗MQ的寶貴資源。

我試圖在官網上找到一種方法,讓每條訊息明確的Ack後再接受下一條。但是好沒有。好在在 gitbooks.io/rabbitmq-quick/ 這兒找到了,通過設定Channel的QOS即可

1 2 var  channel = Connect.CreateModel(); channel.BasicQos(0,1,
false );  //RabbitMQ客戶端接受訊息最大數量

 設定後的結果:


在開啟4個Consumer的情況下,每條訊息處理要耗時2秒。然後問題解決了。Unacked的訊息只有4個。

關注公眾號,分享乾貨,討論技術