Kafka消费者

一个应用程序要从Kafka主题读取消息,需要创建一个消费者对象,订阅主题并接收消息。单个消费者跟不上消息生成速度,对消费者横向扩展,可使用多个消费者从同一主题读取消息,对消息分流。
一般每个消费者都从属于一个消费者群组。一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息。

分区再均衡

再均衡:分区所有权从一个消费者转移到另一个消费者,为消费者群组带来了高可用性和伸缩性。
再均衡期间,消费者无法读取消息,会造成群组一小段时间的不可用。分区重新分配给另一个消费者时,消费者当前的读取状态会丢失,可能需要去刷新缓存,在它重新恢复状态前会拖慢应用程序。
消费者通过向指派为群组协调器broker发送心跳来维持它们和群组的从属关系及它们对分区的所有权关系。只要消费者在正常时间间隔发送心跳,就认为是活跃的。
消费者在轮询消息或提交偏移量时发送心跳。如果消费者停止发送心跳时间足够长,会话过期,群组协调器认为它死亡,会触发一次再均衡。
当消费者加入群组,会向群组协调器发送请求,第一个加入群组的消费者是群主。群主从协调器获取成员列表,负责给每个消费者分配分区。
分配完毕,群主将分配情况发送给协调器,协调器再把这些信息发给消费者,每个消费者只能看到自己的分配信息,只有群主知道所有消费者的分配信息。
实现再均衡监听器,要发生再均衡,在消费者失去对分区所有权提交最后已处理记录的偏移量。

轮询

一旦消费者订阅了主题,轮询就会处理所有细节,包括群组协调,分区再均衡,发送心跳和获取数据。
消费者必须持续对Kafka进行轮询,否则被认为已经死亡。poll方法返回一个记录列表,包括记录所属主题信息,记录所在分区信息,记录在分区里的偏移量以及记录的键值对。
按照规则,一个消费者使用一个线程。

分区分配

为了尽量避免出现重复数据和数据丢失,enable.auto.commit=false,自己控制何时提交偏移量。
Kafka有两种默认的分配策略:
Range:把主题的若干个连续分区分给消费者。
RoundRobin:把主题的所有分区逐个分配给消费者。

提交偏移量

每次调用poll,总是返回生产者写入Kafka但还没有被消费者读取过的记录。
Kafka不像其他队列那样需要得到消费者的确认,消费者可用Kafka跟踪消息在分区里的位置。
消费者会往一个_consumer_offset的特殊主题发送消息,消息里包含每个分区的偏移量。
发生再均衡,每个消费者可能分配新的分区,需要读取每个分区最后一次提交的偏移量,然后从偏移量指定地方处理。
通过控制偏移量提交时间消除丢失消息的可能性,在发生再均衡时减少重复消息的数量。在每次轮询中每处理完一批消息就提交偏移量,只要没有发生不可恢复的错误,会一直尝试直至成功。
同步提交会导致应用程序阻塞,限制吞吐量。异步提交容易消息重复或顺序混乱。
可使用一个单调递增的序列号维护异步提交的顺序,每次提交偏移量后或在回调里提交偏移量时递增序列号。进行重试前,先检查回调的序列号和即将提交的偏移量是否相等,如果相等,没有新的提交。如果序列号比较大, 说明有新的提交发出去了,应停止重试。

你可能感兴趣的:(Kafka消费者)