如何在Kafka消费者组中动态添加消费者

5

我何时需要在消费者组中扩展消费者数量?当生产者速度快时,消费者有哪些触发器可以引起扩展?

3个回答

1
一种直接的方法是获取消费者滞后值(可以计算为已提交偏移量与起始偏移量之间的差),如果最近n次计算出的滞后值在增加,则可以进行扩容,反之亦然。您可能需要考虑一些边缘情况,例如如果消费者数量减少,滞后值会增加,自动扩展功能可能会生成更多线程/机器。

0
在Kafka中创建主题时,需要提供分区复制因子的数量。
假设有一个名为TEST的主题,它有10个分区,为了并行消费数据,需要创建一个由10个消费者组成的消费者组,每个消费者将从各自的分区中消费数据。
这里有一个问题,如果主题有10个分区,而消费者组有12个消费者,那么就会有两个消费者处于空闲状态,直到其中一个消费者死亡。
如果主题有10个分区,而消费者组有8个消费者,那么6个消费者将从6个分区(一个消费者->一个分区)中消费数据,而剩下的两个消费者将负责从两个分区中消费数据(一个消费者-> 2个分区)。这意味着最后两个消费者将从四个分区中消费数据。
因此,首先要决定kafka主题的分区数,更多的分区意味着更多的并行性。
每当向消费者组添加或删除任何新消费者时,kafka都会重新平衡

我正在寻找基于负载的动态缩放。 - Vamsi Jakkula
请问能否解释一下,在“10个分区和消费者组有8个消费者”的例子中,为什么最后6个分区分配给了6个消费者,而剩下的2个消费者会从最后4个分区(1个消费者从2个分区)获取数据? - user3575226

0

实际上,自动缩放并不是一个好主意,因为在Kafka中,消息顺序是在分区中得到保证的。

来自Kafka文档:

  • 由生产者发送到特定主题分区的消息将按照它们发送的顺序追加。也就是说,如果同一生产者发送记录M1和记录M2,并且M1先发送,则M1的偏移量将低于M2,并且在日志中更早出现。
  • 消费者实例按照日志中存储的顺序查看记录。

如果您增加了更多的分区和更多的消费者,以满足分区数量的要求,那么您将无法满足消息的排序保证。

假设您有10个分区,您的键数为102,则此消息将被发送到分区:102%10 = 2

但是,如果您将分区数量增加到15个,那么具有相同键(102)的消息将被发送到不同的分区:102%15 = 12

正如您所看到的,使用这种方法无法保证具有相同键的消息的顺序。

注意:顺便提一下,Kafka默认使用murmur2(record.key())%num partitions算法。 上面的计算只是一个示例。

1
对我来说,顺序并不重要。需要一个自动缩放消费者的解决方案,而不是在消费者组中预先添加许多消费者。 - Vamsi Jakkula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接