例如,假设-kafka topic name-topic\u x topic\u x在kafka代理中有500个分区
现在我们已经为consumer\ux组设置了500个使用者来处理每个分区。
这500个消费者在哪里经营?在一台机器上500根线?这是可能的吗?因为线程和核心之间有关系
如何做到这一点?
即使我们在consumer_x组(1个consumer=5个分区)中减少到100个consumer,上述问题也同样有效
请解释一下
例如,假设-kafka topic name-topic\u x topic\u x在kafka代理中有500个分区
现在我们已经为consumer\ux组设置了500个使用者来处理每个分区。
这500个消费者在哪里经营?在一台机器上500根线?这是可能的吗?因为线程和核心之间有关系
如何做到这一点?
即使我们在consumer_x组(1个consumer=5个分区)中减少到100个consumer,上述问题也同样有效
请解释一下
2条答案
按热度按时间lndjwyie1#
只有在您的用例中,分区和使用者之间保持1:1的关系才是一件很重要的事情:
记录是均匀分布的:这意味着您的生产者必须对发送记录时写入哪些分区有最小的控制。在Kafka2.4之后,这意味着很多,因为默认的分区器不再是循环,而是粘性分区器。所以你需要在producer中显式地设置roundrobin来实现这一点。
偶数分区分配:在kafka的最新版本中,分区分配给使用者的默认行为已经改变。在引入增量式/协作式再平衡协议之后,出现了一种趋势,即将分区分配给相同的活动消费者,以减少在再平衡期间世界暂停的次数。使用更均匀的分配意味着放弃新协议的创新,因此,如果其中一个协议的活跃性受到影响,那么您的消费者就更有可能暂停。
除非您处理的是需要尽快处理每条记录的高吞吐量用例,否则分区和使用者之间的1:1代价太高,因为每个使用者线程都不是免费的。例如,不建议将它们放在同一个框中,因为可用的内核可能很少,而且线程数量较多会导致持续的上下文切换,从而降低吞吐量。解决方案是将这些线程分布在多个盒子上,但是它们。。。成本问题又来了。
我会衡量100:1的效率。这似乎是合理的,特别是如果入口吞吐量不高,并且一些消费滞后是可以容忍的。
w6mmgewl2#
消费者群体的主要目的是将工作分配到多台机器上。每个线程运行一个使用者也是可能的,但在高负载主题场景中,它不会带来任何价值。
Kafka的投票记录效率很高。通常,处理它们是瓶颈。因此,主要思想是将这些工作划分到多台机器上,以便每个使用者应用程序都能跟上工作负载。