RabbitMQ使用QOS(服务质量)+Ack机制解决内存崩溃的情况
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。
【最安全 + 性能不算太差】。