卡夫卡的使用者线程数应等于主题分区数

时间:2019-11-01 15:50:56

标签: apache-kafka kafka-consumer-api

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

如果将Kafka主题设置为具有8个分区与16个分区,在处理上会有任何区别吗?

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

1 个答案:

答案 0 :(得分:0)

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

如果配置正确且在理想条件下,Kafka将从页面缓存中提供数据,因此可以将数据分批发送给使用者,而瓶颈在90%的时间内将成为使用者上分区/可用CPU的数量侧。通常,拥有的分区越多,从Kafka消耗数据的速度就越快,直到消耗者的CPU或带宽受到限制为止,此时,拥有更多或更少的分区并不重要,因为您正在消耗数据无论如何都要尽可能快。

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

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

最后,您不想将其发挥到极致,如果不需要,可以配置1000个分区。每个分区都需要开销,包括提交,zookeeper znode,消费者重新平衡时间,启动时间等。因此,我建议对不同的场景进行基准测试,并查看最适合您的方案。通常,过去,每个使用者线程2-4个分区中的任何一个对我来说都运行良好,即使消息负载很高(主题每秒包含5万条消息,每条消息〜1KB)。