消费RabbitMQ时的注意事项,如何禁止大量的消息涌到Consumer

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消费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即可

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

 设置后的结果:

在开启4个Consumer的情况下,每条消息处理要耗时2秒。然后问题解决了。Unacked的消息只有4个。

 

以上是关于消费RabbitMQ时的注意事项,如何禁止大量的消息涌到Consumer的主要内容,如果未能解决你的问题,请参考以下文章

消息队列--RabbitMQ

如何保证消息不被重复消费?(如何保证消息消费时的幂等性)

如何限制rabbitmq中消费消息的数量?

C#利用RabbitMQ实现消息订阅与发布

RabbitMQ之发布订阅

RabbitMQ消费方式汇总