RabbitMQ的QOS预取模式

RabbitMQ提供了一种QOS(Quality of Service ,服务质量保证)功能,即在非自动确认消息的前提下,如果一定数目的消息(通过基于consume或者channel设置QOS的值)未被确认前,不进行消费新的消息


在RabbitMQ消息的获取方式中,无论是推送Consume、拉取Get哪一种方式,只要不进行消息确认,那么RabbitMQ会认为该消息未被成功处理,则不会将其移除,一般情况下我们让消费者处理一批指定数量的消息,然后再进行批量确认,其用法在RabbitMQ消息应答的最后手动批量确认中,已有相关介绍。


这里假设我们忘记了进行批量确认,或者批量确认出现了问题,那么消费者一直在消费消息且不给予消息确认,那么服务最后就会出现问题,这里就可以利用RabbitMQ的QOS预取模式,来对消费者进行流控,从而限制未ack的消息数量。


注意: 消费确认模式必须是非自动确认ACK机制(这个是使用RabbitMQ的QOS预取模式的前提条件,否则会QOS不生效)


其使用的其实比较的简单,首先需要设置QOS的值;另外,还可以基于消费者Consume和信道Channel的粒度进行设置(global),如下:
RabbitMQ的QOS预取模式_第1张图片


其中basicOos()有多个参数,其参数含义如下:
在这里插入图片描述

  • prefetchSize: 最多传输的内容的大小的限制,0为不限制,但据说prefetchSize参数,RabbitMQ暂未对其没有实现。

  • prefetchCount: 会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该消费者Consumer将阻塞block掉,直到有消息进行ack确认

  • global: true/false,表示是否将上面设置应用于channel,简单点说,就是上面限制是信道channel级别的还是消费者consumer级别。




下面我们调整下参数进行测试,如我们在消费者的生产者发送3条消息,如下:
在这里插入图片描述


然后再消息的消费者端,我们进行消息的消费,这里采用手动确认ack的机制,但是我们不进行确认,进行测试
RabbitMQ的QOS预取模式_第2张图片
RabbitMQ的QOS预取模式_第3张图片
上述这三条消息被消费者消费了,但是并未确认,所以我们关闭该消费者,再次启动该队列的消费者还是可以收到三条消息的。


这里我们然后再使用RabbitMQ的QOS预取模式,对其进行流控,从而限制未ack的消息数量。如我们限制一个信道最多只能有2个未确认的消息,如下:
RabbitMQ的QOS预取模式_第4张图片
RabbitMQ的QOS预取模式_第5张图片




另外对于basicOos()的参数global,上述进行了介绍,true表示限制信道,false表示限制单独的消费者,但是如果我们同时进行设置的话,如下:
在这里插入图片描述

RabbitMQ将此解释为意味着两个预取限制应该彼此独立地强制执行,即两个条件都需要进行满足


之前我们在RabbitMQ的基础使用 —— Direct模式(二)中介绍了一个连接可以有多个信道,其实我们一个信道中肯定也是可以有多个消费者的,我们只需要在其中声明多个消费者即可:
RabbitMQ的QOS预取模式_第6张图片


这样的话,一个信道中就存在两个消费者了,其也是轮询进行消费消息的,那么上述的设置的效果为:每个消费者最多可以有50个未确认的消费,但是该信道所有的消费者加起来最多只能有100个未确认的消息。

你可能感兴趣的:(RabbitMQ)