在 Apache Kafka 中,为什么消费者实例不能多于分区?

2023-12-20

我正在学习卡夫卡,阅读这里的介绍部分

https://kafka.apache.org/documentation.html#introduction https://kafka.apache.org/documentation.html#introduction

特别是关于消费者的部分。在引言的倒数第二段中写道

卡夫卡做得更好。通过在主题中采用并行性(分区)概念,Kafka 能够在消费者进程池上提供排序保证和负载平衡。这 是通过将主题中的分区分配给消费者组中的消费者来实现的,这样 每个分区仅由组中的一个消费者使用。通过这样做,我们确保 消费者是该分区的唯一读取者,并按顺序消费数据。由于有很多 分区这仍然可以平衡许多消费者实例的负载。但请注意,不能有 消费者实例多于分区。

我的困惑源于最后一句话,因为在作者描述两个消费者组和一个 4 分区主题的那段正上方的图像中,消费者实例比分区多!

消费者实例的数量不能多于分区也是没有意义的,因为这样分区就会非常小,而且为​​每个消费者实例创建新分区的开销似乎会让 Kafka 陷入困境。我知道分区用于容错并减少任何一台服务器上的负载,但上面的句子在分布式系统的上下文中没有意义,该系统应该能够一次处理数千个消费者。


好吧,要理解它,需要理解几个部分。

  1. 为了提供排序总订单,消息只能发送给一个消费者。否则效率会非常低,因为它需要等待所有消费者都收到消息才能发送下一条消息:

然而,虽然服务器按顺序分发消息,但消息是异步传递给消费者的,因此它们可能会乱序到达不同的消费者。这实际上意味着在并行消费的情况下消息的顺序会丢失。消息系统通常通过“独占消费者”的概念来解决这个问题,该概念只允许一个进程从队列中消费,但这当然意味着处理中没有并行性。

卡夫卡做得更好。通过主题中的并行性(分区)概念,Kafka 能够在消费者进程池上提供排序保证和负载平衡。这是通过将主题中的分区分配给消费者组中的消费者来实现的,以便每个分区恰好由该组中的一个消费者消费。通过这样做,我们确保消费者是该分区的唯一读取者并按顺序消费数据。由于存在许多分区,这仍然可以平衡许多消费者实例的负载。但请注意,消费者实例的数量不能多于分区的数量。

Kafka 仅提供分区内消息的总顺序,而不提供主题中不同分区之间的消息总顺序。

另外,您认为的性能损失(多个分区)实际上是性能增益,因为 Kafka 可以完全并行地执行不同分区的操作,同时等待其他分区完成。

  1. 图中显示了不同的消费者组,但每个分区最多一个消费者的限制仅限于一个组内。您仍然可以拥有多个消费者组。

一开始描述了两种场景:

如果所有消费者实例都有相同的消费者组,那么这就像传统的队列在消费者上平衡负载一样工作。

如果所有消费者实例都有不同的消费者组,那么这就像发布-订阅一样,所有消息都会广播给所有消费者。

因此,订阅者组越多,性能就越低,因为 kafka 需要将消息复制到所有这些组并保证总​​顺序。

另一方面,组越少,分区越多,您从并行化消息处理中获得的收益就越多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Apache Kafka 中,为什么消费者实例不能多于分区? 的相关文章

随机推荐