有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
RocketMQ 有两种常用的消费模式,Pull 和 Push,而 Push 模式的实现是基于 Pull 模式,只不过对 Pull 模式做了个包装,所以 RocketMQ Push 模式并不是真正意义上的推模式,还是拉模式。
可以认为 RocketMQ SDK 会不断的进行消息拉取任务。对于每一次拉取的结果:
当从 broker 拉取到消息后,如果消息被过滤掉(例如 tag 过滤),则继续将拉取请求放入阻塞队列中继续循环执行消息拉取任务,否则将消息放入消费者消费线程去执行,而将拉取请求放入阻塞队列中。
如果从 broker 端没有可拉取的新消息或者没有匹配到消息,则将 pullRequest 放入阻塞队列中继续循环执行消息拉取任务。
从这里可以看到,如果用户没有消息生产,只要有消费者在线,那么都会周期性的向服务端请求,这种请求也能保证消息消费的及时性。如果用户想减少拉取次数,

如何处理

对于 Pull 模式的消费者,由于用户完全自主控制拉取频率,所以用户只需要自己在拉取一次之后,进行对应的等待,或者使用对应的限流组件来控制。
而对于 Push 模式的消费者,那么可以设置 PullInterval 拉长拉取间隔。
?// 设置拉取间隔 60秒
pushConsumer.setPullInterval(60 * 1000);
注意:
但是相应的需要注意,消息消费的延迟可能上升,修改需要谨慎。
如果用户生产消息量很少,基本上会命中长轮询的时间,目前 SDK 固定了长轮询是15秒,也就是说,对于一个 queue,一个 broker,每分钟最少会发起4次拉取。如果有10个 Topic,每个 Topic 3个队列,服务端有2个 broker,那么这个拉取数量为10*3*2*4=240,也就是每秒4个拉取。
运行过程中,会随着用户生产消费,可能产生重试 Topic,这时候,因为要拉取重试队列,所以消费拉取频率还会上升。


http://www.vxiaotou.com