Rocketmq offset进度管理

本文深入探讨RocketMQ中消费进度(offset)的管理,包括消费者端的提交offset入口、updateOffset逻辑及两种提交方式,以及broker端的ConsumerOffsetManager。消费者端在消息消费后更新offset,通过拉取消息时提交或定时提交。broker端的offset存储在内存中,并定期持久化到文件。
摘要由CSDN通过智能技术生成

下文以DefaultMQPushConsumerImpl集群模式消费消息为例。

概述

消息消费完成后,需要将消费进度存储起来,即前面提到的offset。广播模式下,同消费组的消费者相互独立,消费进度要单独存储;集群模式下,同一条消息只会被同一个消费组消费一次,消费进度会参与到负载均衡中,故消费进度是需要共享的。

消费者端

提交offset入口

入口在org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService#processConsumeResult中的最后一段逻辑:

 public void processConsumeResult(
        final ConsumeConcurrentlyStatus status,
        final ConsumeConcurrentlyContext context,
        final ConsumeRequest consumeRequest
    ) {
        ------------------省略-----------------------

        long offset = consumeRequest.getProcessQueue().removeMessage(consumeRequest.getMsgs());
        if (offset >= 0 && !consumeRequest.getProcessQueue().isDropped()) {
            this.defaultMQPushConsumerImpl.getOffsetStore().updateOffset(consumeRequest.getMessageQueue(), offset, true);
        }
    }

消息消费完成(不论成功或失败)后,将消息从ProcessQueue中移除,同时返回ProcessQueue中最小的offset,使用这个offset值更新消费进度,removeMessage返回的offset有两种情况,一是已经没有消息了,返回
ProcessQueue最大offset+1,二是还有消息,则返回未消费消息的最小offset。举个例子,ProcessQueue中有offset为101-110的10条消息,如果全部消费完了,返回的offset为111;如果101未消费完成,102-110消费完成,则返回的offset为101,这种情况下如果消费者异常退出,会出现重复消费的风险,所以要求消费逻辑幂等。

updateOffset逻辑

看RemoteBrokerOffsetStore的updateOffset()逻辑,将offset更新到内存中,这里RemoteBrokerOffsetStore使用ConcurrentHashMap保存MessageQueue的消费进度:

    @Override
    public void updateOffset(MessageQueue mq, long offset, boolean increaseOnly) {
        if (mq != null) {
            AtomicLong offsetOld = this.offsetTable.get(mq);
            if (null =&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值