Kafka消费者的偏移量和高级/简单消费者

提交和偏移量

提交:更新分区的当前位置称为提交,当前版本(0.10.1.1)用topic ___consumer_offsets 保存提交的偏移量

偏移量:消费者在Kafka追踪到消息在分区里的位置

消费者在崩溃或者有新的消费者加入群组,就会触发再均衡。这是需要读取最后一次偏移量,然后从偏移量指定的地方继续处理。提交的偏移量小于真实的偏移量,消息会被重复处理。大于真实的偏移量,消息会丢失。

Kafka存储偏移量的位置

kafka能灵活地管理offset,可以选择任意存储和格式来保存offset。KafkaOffsetMonitor目前支持以下流行的存储格式。

  • kafka0.8版本以前,offset默认存储在zookeeper中(基于Zookeeper)
  • kafka0.9版本以后,offset默认存储在内部的topic中(基于Kafka内部的topic)即前文说的 ___consumer_offsets这个topic
  • Storm Kafka Spout(默认情况下基于Zookeeper)这个没有验证,不过在目前我使用Storm框架中仍用上一种方法获取数据

KafkaOffsetMonitor每个运行的实例只能支持单一类型的存储格式。

kafka偏移量的相关配置

enable.auto.commit

true(默认):自动提交偏移量,可以通过配置 auto.commit.interval.ms属性来控制提交偏移量的频率。(基于时间间隔)

false:手动控制偏移量。可以在程序逻辑必要的时候提交偏移量,而不是基于时间隔。此时可以进行同步,异步,同步异步组合(参考相应api)。

auto.offset.reset

无法读取偏移量时候读取消息的设置

latest(默认):从最新记录读取数据。

earliest:从起始位置读取数据。


高级/简单消费者

目前,kafka有两类消费者:高级消费者(high-level consumer )和简单消费者( simple consumer )。在简单的消费者中,用户可以指定代理分区和偏移,但没有故障转移/负载均衡的支持。因此,具有要求3和4但不要求组/负载均衡的用户更愿意使用简单的消费者。基本上,高级消费者和简单的消费者有以下的区别。

1.自动/隐藏偏移管理(Offset Management )

2.自动(简单)分区分配

3.Broker 故障转移=>自动重新平衡

4.Consumer 故障转移=>自动重新平衡

如果希望控制偏移管理与其他人保持不变,一种选择是将高级消费者的当前ZK实现暴露给用户并允许他们覆盖; 另一种选择是更改高级使用者API以返回与消息关联的偏移量向量

如果想要控制分区分配,一个选项是更改高级使用者API以允许在创建流时传入此类配置信息; 另一个选项是ad-hoc:只需创建一个单分区主题并将其分配给使用者。

如果只希望自动分区分配更加“智能”并考虑共址,那么有一个选项是将主机/机架信息存储在ZK中,让负载均衡算法在进行计算时读取它们。

使简单的消费者复杂化可能会发生与现有应用程序兼容的风险,更好的操作是修补高级消费者。


参考资料

《Kafka权威指南》个人对这本书的定位是一本很经典很实用的工具书,阅读方法也是遇到相关问题再查询。

http://orchome.com/54比较好和全面的讲解了偏移量。

https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Client+Re-Design官方关于消费组的文档,讲的很细。


分区的问题大致总结了一些,不过具体的分区设置始终要与集群和不同组件结合来看的。

 Kafka分区问题的记录


最近有个关于偏移量问题的小随笔:https://blog.csdn.net/jyj1100/article/details/90736416kafka指定偏移量拉取与偏移量半自动提交