Kafka消费者策略、Rebalance机制、Offset存储机制

  • 2022-10-27
  • 浏览 (1309)

本篇介绍kafka消费者策略,分区分配策略,Rebalance重分配策略,以及offset存储机制

分区分配策略

前面提到消费者组订阅的topic的每个分区只能被同一消费者组内的一个消费者所消费,同一个消费者组内的消费者是如何选择它应该消费的topic的分区有下面两种策略:

  • RandomRobin(轮循):把消费者组订阅的所有topic当成一个整体来看待,将这些topic内的分区轮循着分配给组内的所有消费者,可以达到均衡分配的目的。但可能会出现这么一种情况:消费者组内的消费者1订阅了topicA,消费者2订阅了topicB,由于对于消费者组来说它将这两个topic都订阅了,结果就是消费者1可能会消费到topicB,消费者2消费到topicA的分区。因此使用这种策略的前提条件是要保证当前消费者组内的所有消费者订阅的topic必须是一样的才可以。
  • Range(范围):Kafka的默认策略,将topic看成一个整体,只会被消费者组内订阅了该主题的消费者消费,这就保证了不会出现其他未订阅主题的消费者消费到了不该消费的数据。但这种策略也可能会出现负载不均衡的情况,例如topicA有3个分区,topicB也有3个分区,消费者1和2都订阅了topicA和topicB,由于range机制,让消费者1消费了2+2=4个分区,消费者2消费了1+1=2个分区。

因此当消费者组内都订阅了相同的主题时建议使用RandomRobin轮循策略,这样能够达到让消费者负载均衡的状态。当消费者组内订阅的主题不一样的时候就必须要用Range范围策略。

Rebalance机制

消费者组内的消费者成员消费的主题分区会在下面这些场景下发生重新分配,这种机制叫做 Rebalance机制

  • 消费者组内消费者的数量发生变化时。
    • (1). 新增消费者;
    • (2). 消费者故障;
    • (3). 当消费者组内数量和分区数量完全一致时,如果再加入一个消费者,此时也会触发重新分配,但结果是有一个组内消费者消费会不到分区,处于资源浪费的状态。
  • 消费者组订阅的 Topic 数量发生变化时。
  • 消费者组订阅的 Topic 的分区数量发生变化时。

Offset存储机制

由于消费者在消费消息的时候可能会由于各种原因而断开消费,当重新启动消费者时我们需要让它接着上次消费的位置offset继续消费,因此消费者需要实时的记录自己以及消费的位置。在0.90版本之前,这个信息是记录在zookeeper内的,在0.90之后的版本,offset保存在__consumer_offsets 这个topic内。

由于上面介绍的rebalance分区重新分配的情况出现,因此 offset是按照消费者组单位来存储 的,在zk内也是按照消费者组来记录offset的。根据 ConsumerGroup、Topic、Partition 我们可以确定一个唯一的offset,当消费者组内触发rebalance机制时,消费者组内的其他消费者也可以根据记录的来定位前一个消费者消费到的offset进而接着上次的Offset继续消费,来保证消费端的一致性。

转自:https://blog.csdn.net/wsdc0521/article/details/108604443

1  赞