java系统找不到指定文件怎么解决
321
2022-10-09
RocketMQ 5.0 POP 消费模式探秘
作者:凯易&耘田审核校对:白玙编辑&排版:雯燕 前言:随着 RocketMQ 5.0 preview 的发布,5.0 的重大特性逐步与大家见面。POP Consumer 作为 5.0 的一大特性,POP 消费模式展现了一种全新的消费模式。其具备的轻量级,无状态,无队列独占等特点,对于消息积压场景,Streaming 消费场景等都非常友好。在介绍 POP Consumer 之前,我们先回顾一下目前使用较多的 Push Consumer。
Push Consumer
熟悉 RocketMQ 的同学对 Push Consumer 肯定不会陌生,客户端消费一般都会使用这种消费模式,使用这种消费模式也比较简单。我们只需简单设置,并在回调方法 ConsumeMessage 中写好业务逻辑即可,启动客户端应用就可以正常消费消息了。
public class PushConsumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("CID_JODIE_1");
consumer.subscribe("test_topic", "*");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List
POP Consumer
通过前面 Push Consumer 的介绍,我们了解到 Push Consumer 的一些特点。
队列独占:Broker 上的每个队列只能分配到相同 Consumer group 的一台 Push Consumer 机器上。 消费后更新 offset:每次 Pull 请求拉取批量消息到本地队列缓存,本地消费成功才会 commit offset。
富客户端,客户端逻辑比较重,多语言支持不友好; 客户端或者 Broker 升级发布,重启等 Rebalance 可能导致消费挤压; 队列占位,单队列与单 Consumer 绑定,单个 Queue 消费能力无法横向扩展; 机器 hang,会导致挤压。
Broker 实现
模式切换之后,老模式的 retry 里的消息还需要继续处理,否则就丢消息了。
Push & POP 切换
Push 切换到 POP
正常队列切换到 POP 模式 正常队列的 POP 请求会处理对应的 POP retry 队列 针对 Push retry 队列,我们保留原来 Push retry 队列的拉取任务,并且是工作在 Push 模式。
POP 切换到 Push
正常队列切换到 Push 模式 Push retry 队列自然有相应的拉取任务 之前 POP 的 retry 队列,我们在客户端自动创建拉取任务,以Push 模式去拉取。注意这里的拉取任务只拉取 POP 的 retry 队列。
总结下来就是,对于 retry 队列,我们会特殊处理不参与模式切换。
总结
最后我们总结下 POP Consumer。POP 作为一种全新的消费模式,解决了 Push 模式的一些痛点,使客户端无状态,更加轻量,消费逻辑也基本都收敛到了 Broker,对多语言的支持十分的友好。在 API 层面也与 Push 完成了融合,继承了 Push API 的简单易用,同时实现了 Push,POP 之间的自由切换。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~