This site is best viewed in Google Chrome
5/13/2019 10:32

在0.10版本后，kafka把这个offset的保存，从zk总剥离，保存在一个名叫__consumeroffsets topic的topic中。写进消息的key由groupid、topic、partition组成，value是偏移量offset。topic配置的清理策略是compact。总是保留最新的key，其余删掉。一般情况下，每个key的offset都是缓存在内存中，查询的时候不用遍历partition，如果没有缓存，第一次就会遍历partition建立缓存，然后查询返回。



对Kafka offset的管理，一直没有进行系统的总结，这篇文章对它进行分析。



offset是consumer position，Topic的每个Partition都有各自的offset.





消费者需要自己保留一个offset，从kafka 获取消息时，只拉去当前offset 以后的消息。Kafka 的scala/java 版的client 已经实现了这部分的逻辑，将offset 保存到zookeeper 上


  1. auto.offset.reset
    smallest : automatically reset the offset to the smallest offset
    largest : automatically reset the offset to the largest offset
    anything else: throw exception to the consumer


  1. auto.commit.enable（例如true，表示offset自动提交到Zookeeper）


  1. auto.commit.interval.ms(例如60000,每隔1分钟offset提交到Zookeeper)




4. offsets.storage
Select where offsets should be stored (zookeeper or kafka).默认是Zookeeper


  1. 基于offset的重复读


  1. Kafka的可靠性保证(消息消费和Offset提交的时机决定了At most once和At least once语义)

At Most Once:

At Least Once:


Kafka默认实现了At least once语义


<< Previous Posts Newer Posts >>