按照官网提供的订阅型写法( 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便可服务器
var channel = Connect.CreateModel(); channel.BasicQos(0,1,false); //RabbitMQ客户端接受消息最大数量
设置后的结果:ide
在开启4个Consumer的状况下,每条消息处理要耗时2秒。而后问题解决了。Unacked的消息只有4个。ui