【发布时间】:2020-07-06 16:11:23
【问题描述】:
我应该如何知道何时必须扩展消费者组中的消费者。当有快速生产者时,消费者扩展的触发器是什么?
【问题讨论】:
标签: apache-kafka kafka-producer-api
我应该如何知道何时必须扩展消费者组中的消费者。当有快速生产者时,消费者扩展的触发器是什么?
【问题讨论】:
标签: apache-kafka kafka-producer-api
一种直接的方法是获取消费者延迟(这可以计算为提交的偏移量和开始偏移量之间的差异),如果在最后 n 次计算的延迟增加,您可以扩大规模,反之亦然。您可能需要考虑一些边缘情况,例如,如果消费者下降并且延迟会增加并且自动缩放功能可能会产生更多线程/机器)。
【讨论】:
在Kafka中创建topic时,需要提供partitions个数和replication factor。
假设有一个名为 TEST 的主题有 10 个分区,为了并行消费数据需要创建一个有 10 个消费者的消费者组,每个消费者将消费来自各自分区的数据。
这里有一个问题,如果主题有 10 个分区,而消费者组有 12 个消费者,那么两个消费者将保持空闲状态,直到其中一个消费者死亡。 p>
如果主题有 10 个分区并且消费者组有 8 个消费者,那么 6 个消费者 将使用来自 6 个分区(一个消费者->一个分区)的数据) 而剩下的两个消费者将负责消费来自两个分区(一个消费者-> 2 个分区)的数据。它的意思是最后两个消费者消费来自四个分区的数据。
因此首先要确定你的 kafka 主题的分区数量,更多的分区意味着更多的并行性。
每当向消费者组添加或删除任何新消费者时,重新平衡都由 kafka 负责。
【讨论】:
实际上自动缩放并不是一个好主意,因为在 Kafka 中,消息顺序在分区中得到保证。
来自 Kafka 文档:
- 生产者发送到特定主题分区的消息将按照发送顺序附加。也就是说,如果发送了一条记录 M1
由同一生产者作为记录 M2,先发送 M1,然后发送 M1
将具有比 M2 更低的偏移量并在日志中更早出现。- 消费者实例按照记录在日志中的存储顺序查看记录。
如果你添加更多的分区和更多的消费者相对于分区的数量,那么你就不能满足消息的排序保证。
假设你有 10 个分区,你的 key 数量是 102,那么这个消息会被发送到分区:102 % 10 = 2
但是,例如,如果您将分区数增加到 15,则具有相同键 (102) 的消息将被发送到不同的分区:102 % 15 = 12
正如您所见,使用这种方法无法保证具有相同键的消息的顺序。
注意:卡夫卡默认使用murmur2(record.key())) % num partitions算法。上面的计算只是一个例子。
【讨论】: