消費RabbitMQ時的注意事項,如何禁止大量的消息涌到Consumer,保證線程安全

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


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

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

我試圖在官網上找到一種方法,讓每條消息明確的Ack後再接受下一條。可是好沒有。好在在 gitbooks.io/rabbitmq-quick/ 這兒找到了,經過設置Channel的QOS便可服務器

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

 設置後的結果:ide


在開啓4個Consumer的狀況下,每條消息處理要耗時2秒。而後問題解決了。Unacked的消息只有4個。ui

相關文章
相關標籤/搜索