rocketMq -- offset管理

offset的存储路径

store/config/consumerOffset.json

offset的作用

服务启动时恢复消费队列消费进度

offset文件格式

文件的命名格式为“topic@消费者群组”,具体的内容是“消费队列:消费进度”;那么这些数据是从哪来的呢?

offset的更新时机

现将消费进度更新到内存中(RemoteBrokerOffsetStore#updateOffset),消费进度更新方式为只增更新

而具体持久化到磁盘上分为两种场景:

1、定时上报(每隔10秒上报一次消费进度)

 private void persistAllConsumerOffset() {
        Iterator<Entry<String, MQConsumerInner>> it = this.consumerTable.entrySet().iterator();
        while (it.hasNext()) {
            Entry<String, MQConsumerInner> entry = it.next();
            MQConsumerInner impl = entry.getValue();
            impl.persistConsumerOffset();
        }
    }

2、服务正常关闭的时

 public synchronized void shutdown() {
        switch (this.serviceState) {
            case CREATE_JUST:
                break;
            case RUNNING:
                this.persistConsumerOffset();
                this.mQClientFactory.unregisterConsumer(this.defaultMQPullConsumer.getConsumerGroup());
                this.mQClientFactory.shutdown();
                log.info("the consumer [{}] shutdown OK", this.defaultMQPullConsumer.getConsumerGroup());
                this.serviceState = ServiceState.SHUTDOWN_ALREADY;
                break;
            case SHUTDOWN_ALREADY:
                break;
            default:
                break;
        }
    }

offset更新策略

那么如果存在t1、t2、t3三个任务消费的offset分别为30、50、70(队列先最小的offset为20)且t3优先于t1、t2消费完成,那么会将70更新到Broker中么?答案是否定,因为不论t1、t2、t3消费前后顺序如何,offset的更新策略为只会更新最小的offset到broker,因此此时只会将20更新到Broker中

猜你喜欢

转载自blog.csdn.net/weixin_38829588/article/details/124587055