繁体   English   中英

Kafka 的消费者线程数应该等于主题分区数

[英]Kafka Should Number of Consumer Threads equal number of Topic Partitions

假设您确定要为您的应用程序使用正好 8 个使用者线程。

如果将 Kafka 主题设置为具有 8 个分区与 16 个分区,处理会有什么不同吗?

在第一种情况下,每个线程被分配到一个具有两倍数据的分区,在第二种情况下,每个线程被分配到两个分区,每个分区都有一半的数据。 在我看来,这两种设置之间没有区别。

我相信,如果您的线程不受 CPU 限制(并且网络容量不足),那么在消费者方面可能会有所不同。 假设 Kafka 代理或滞后消费者上有无限数据,由于在第二个示例中每个线程都从两个分区消费,因此与每个线程仅分配一个分区相比,kafka 代理能够发送更多数据。 Kafka 对每次 fetch 可以检索的最大字节数有限制(配置中的replica.fetch.max.bytes ),所以如果你将分区增加 2 倍,你可以增加容量,假设数据是可用的。

如果配置得当,并且假设条件理想,Kafka 将从页面缓存中提供数据,因此它可以将数据向下发送给消费者,90% 的时间,瓶颈将是消费者端的分区数量/可用 CPU。 一般来说,你拥有的分区越多,你从 Kafka 消费的速度就越快,直到你的 CPU 或带宽受限于消费者,此时你有更多或更少的分区并不重要,因为你正在消费数据无论如何,尽可能快。

需要考虑的另一件事是,可能会有更多的消费者提交被发送回代理,因为现在有更多的分区,这意味着集群中有一些额外的开销/串扰。 它可能不是提交的 2 倍,但可能高于第一种情况的提交的 1 倍。

要记住的重要一点是,只要有可能,就在你的消费者线程外进行实际的消息处理。 也就是说,不要在从 Kafka 消费/轮询的同一线程上处理入站消息。 一开始它可能会起作用,但是如果您的处理时间更长,您将开始遇到问题,有延迟,入站端的大量增加等。只要有可能,将入站消息放在队列中,然后让另一个线程担心处理/解析它们。

最后,你也不要把这个发挥到极致,没必要就配置1000个分区。 每个分区都需要提交开销、zookeeper znode、消费者重新平衡时间、启动时间等。所以,我建议对不同的场景进行基准测试,看看什么最适合你。 一般来说,过去每个消费者线程 2-4 个分区对我来说效果很好,即使消息负载非常高(主题每秒有 50K+ 消息,每个 ~1KB)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM