0

比如说 - Kafka 主题名称 - topic_X topic_X 在 Kafka Broker 中有 500 个分区

现在我们为 Consumer_X 组设置了 500 个消费者来处理每个分区。

在哪里运行这 500 名消费者?单机500线程?这可能吗 - 因为线程与核心有关系

如何做到这一点?

即使我们在 Consumer_X 组中减少到 100 个消费者(1 个消费者 =5 个分区),那么上述问题也同样有效

请解释一下

4

2 回答 2

1

消费者组的主要目的是将工作拆分到多台机器上。每个线程运行一个消费者也是可能的,但在高负载主题场景中,它不会带来任何价值。

从 Kafka 轮询记录非常有效。通常,处理它们是瓶颈。因此,主要思想是将工作拆分到多台机器上,以便每个消费者应用程序都能跟上工作负载。

于 2020-07-28T08:10:06.800 回答
0

只有在您的用例中,分区和消费者之间的 1:1 关系才有意义:

  1. 记录是均匀分布的:这意味着您的生产者必须对发送记录时正在写入的分区进行最低限度的控制。在 Kafka 2.4 之后,这意味着很多,因为默认的分区器不再是 RoundRobin,而是 Sticky。因此,您需要在生产者中显式设置 RoundRobin 才能实现这一点。
  2. 甚至分区分配:在最近的 Kafka 版本中,将分区分配给消费者的默认行为发生了变化。在引入增量/合作再平衡协议之后,有一种趋势是分区被分配给相同的消费者,以减少再平衡期间的停顿。使用更均匀的分配意味着放弃新协议的创新,因此,如果其中一个的活跃性受到损害,使您的消费者更有可能暂停。

除非您正在处理需要尽快处理每条记录的高吞吐量用例,否则分区和消费者之间的 1:1 成本太高,因为每个消费者线程都不是免费的。例如,不建议将它们放在同一个盒子中,因为您可能只有很少的内核可用并且更高的线程数会导致不断的上下文切换,从而降低吞吐量。解决方案是将这些线程分布在多个盒子上,但是它们……成本问题又来了。

我会衡量拥有 100:1 的效率。这似乎是合理的,特别是如果入口吞吐量不高并且一些消费者滞后是可以容忍的。

于 2020-08-04T13:16:46.887 回答