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中