RocketMQ源码:ACK机制及消费进度管理

1. 消息的ACK机制

consumer的每个实例是靠AllocateMessageQueueStrategy队列分配来决定如何消费消息的。那么消费进度具体是如何管理的,又是如何保证消息成功消费的?(RocketMQ有保证消息肯定消费成功的特性,失败则重试)?由于以上工作所有的机制都实现在PushConsumer中,所以本文的原理均只适用于RocketMQ中的PushConsumer即Java客户端中的DefaultPushConsumer。 若使用了PullConsumer模式,类似的工作如何ack,如何保证消费等均需要使用方自己实现。

2. 消费进度管理

在创建消费者添加了一个消费回调监听器:

//并发消费监听器
consumer.registerMessageListener(new MessageListenerConcurrently() {

    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {
        //用户自定义业务处理
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});
复制代码
//顺序消费监听器
consumer.registerMessageListener(new MessageListenerOrderly() {

    AtomicLong consumeTimes = new AtomicLong(0);
    @Override
    public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs,ConsumeOrderlyContext context) {
        
		//用户业务处理
  
        return ConsumeOrderlyStatus.SUCCESS;

    }
});
复制代码

在执行完成监听器的业务逻辑后根据返回的状态客户端做后续的处理,这里分为两种:

  1. ConsumeOrderlyStatus(SUCCESS,SUSPEND_CURRENT_QUEUE_A_MOMENT 其他的被Deprecated标记)
  2. ConsumeConcurrentlyStatus(CONSUME_SUCCESS,RECONSUME_LATER)

3.并发消费进度管理

并发消费主要通过ConsumeMessageConcurrentlyService来处理。ConsumeMessageConcurrentlyService#processConsumeResult处理消费的。第一部分根据消费状态统计消费成功和消费失败的TPS信息:

switch (status) {
    case CONSUME_SUCCESS:
        if (ackIndex >= consumeRequest.getMsgs().size()) {
            ackIndex = consumeRequest.getMsgs().size() - 1;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值