RabbitMQ使用QOS(服务质量)+Ack机制解决内存崩溃的情况

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

【最安全 + 性能不算太差】。

相关文档
最新文档