RabbitMQ 使用QOS(服務質量)+Ack機制解決內存崩潰的情況


當消息有幾萬條或者幾十萬條的時候,如果消費的方式不對,會造成內存崩潰的情況

一:consumer

1. 短鏈接:basicget 獨自去獲取message。。。 request 的方式去獲取,斷開式。。。

 

2. 長連接:eventbasicconsumer。。。 【訂閱式】


1. eventbasicconsumer + noack....

consumer端處理一條數據需要耗費 1s鍾。。。。

《1》 確認機制。。。 不管你是否卻不確認,消息都會一股腦全部打入到你的consumer中去。。。

《2》 QOS =》 服務質量。。。 【QOS + Ack】機制,解決這個問題。。。
我希望是一條一條從broke中打過來。。。

解決辦法就是在channel設置好通道。。。

channel.BasicQos(0, 1, false);////這樣RabbitMQ就會使得每個Consumer在同一個時間點最多處理一個Message。換句話說,在接收到該Consumer的ack前,他它不會將新的Message分發給它。
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);

consumer.Received += (sender, e) =>
{
var msg = Encoding.UTF8.GetString(e.Body);

Console.WriteLine(msg);
};

channel.BasicConsume("mytest", true, consumer);


eventbasicconsumer : noack=true, 直連 =》 會造成application內存暴漲 + 可能丟失數據【application掛了】

noack=false, 直連 =》 造成【application】可能會掛掉。。

noack + QOS 直連 =》 沒問題。。。 【我們可以想象的】

 

BasicGet: 獲取redis中的操作模式是一樣的。。。。
不利的地方,就是每次都會創建一個channel。。。。 【最安全 + 性能不算太差】


免責聲明!

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



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