SocketMQ Offset管理
因为RocketMQ的消息存储在Broker中的CommitLog中,由索引文件ConsumerQueue来查询消息,ConsumerQueue中用来定位消息的就是CommitLog的Offset,所以消费者或者Broker通过管理Offset来管理消费进度。
消费模式
广播消费
ConsumerGroup中的所有Consumer都可以消费Topic的所有消息,各自的消费进度没有交集,所以offset是consumer本地管理
集群消费
ConsumerGroup中的所有Consumer互斥消费Topic的消息,即一个消息只能被一个Consumer消费,ConsumerGroup下所有Consumer共同维护一个消费进度,所以offset是在Broker端远程管理
Offset的提交方式
在集群消费模式下,Consumer向Broker提交offset的方式有两种:
同步提交
- Consumer处理完消息后会向Broker提交offset,然后等待Broker的成功响应,在超时时间内获取到响应则进行下一批消息获取,否则重新提交offset,直到获取响应,这个过程中Consumer是阻塞的
异步提交
- Consumer处理完消息后会向Broker提交offset,不等待Broker响应,直接获取下一批消息,提高了消费者的吞吐量,但是一旦Broker宕机了,offset没有持久化,当Broker重启后就会重复消费