【问题标题】:How to increase Kafka Consumers no如何增加卡夫卡消费者没有
【发布时间】:2020-07-28 05:57:03
【问题描述】:
比如说——
卡夫卡主题名称 - topic_X
topic_X 在 Kafka Broker 中有 500 个分区
现在我们为 Consumer_X 组设置了 500 个消费者来处理每个分区。
在哪里运行这 500 个消费者?
单机500线程?这可能吗 - 因为线程与核心有关系
如何做到这一点?
即使我们将 Consumer_X 组中的消费者减少到 100 个(1 个消费者 =5 个分区),那么上述问题也同样有效
请解释一下
【问题讨论】:
标签:
apache-kafka
kafka-consumer-api
spring-kafka
aws-msk
【解决方案1】:
消费者组的主要目的是将工作分散到多台机器上。每个线程运行一个消费者也是可能的,但在高负载主题场景中,它不会带来任何价值。
从 Kafka 轮询记录非常高效。通常,处理它们是瓶颈。因此,主要想法是将工作拆分到多台机器上,以便每个消费者应用程序都能跟上工作负载。
【解决方案2】:
只有在你的用例中,分区和消费者之间的关系是 1:1 的:
-
记录是均匀分布的:这意味着您的生产者必须对在发送记录时写入哪些分区进行最低限度的控制。在 Kafka 2.4 之后,这意味着很多,因为默认分区器不再是 RoundRobin,而是 Sticky。因此,您需要在生产者中显式设置 RoundRobin 才能实现这一点。
-
均匀分区分配:在最近的 Kafka 版本中,将分区分配给消费者的默认行为发生了变化。在引入增量/合作再平衡协议之后,存在一种趋势,即分区被分配给同一个活着的消费者,以减少再平衡期间的 stop-the-world 停顿。使用更均匀的分配分配意味着放弃新协议的创新,因此,如果其中一个的活跃度受到损害,您的消费者更有可能暂停。
除非您正在处理需要尽快处理每条记录的高吞吐量用例,否则分区和消费者之间的 1:1 成本太高,因为每个消费者线程都不是免费的。例如,不建议将它们放在同一个盒子中,因为您可能只有很少的内核可用,并且较高的线程数会导致不断的上下文切换,从而降低吞吐量。解决方案是将这些线程分布在多个盒子上,但它们......这里又出现了成本问题。
我会衡量 100:1 的效率。这似乎是合理的,尤其是在入口吞吐量不高且一些消费者延迟是可以容忍的情况下。