【发布时间】:2020-02-27 22:09:18
【问题描述】:
假设您确定要为您的应用程序使用 8 个消费者线程。
如果将 Kafka 主题设置为具有 8 个分区与 16 个分区,处理会有什么不同吗?
在第一种情况下,每个线程被分配到一个具有两倍数据的分区,在第二种情况下,每个线程被分配到两个分区,每个分区都有一半的数据。在我看来,这两种设置之间没有区别。
【问题讨论】:
标签: apache-kafka kafka-consumer-api
假设您确定要为您的应用程序使用 8 个消费者线程。
如果将 Kafka 主题设置为具有 8 个分区与 16 个分区,处理会有什么不同吗?
在第一种情况下,每个线程被分配到一个具有两倍数据的分区,在第二种情况下,每个线程被分配到两个分区,每个分区都有一半的数据。在我看来,这两种设置之间没有区别。
【问题讨论】:
标签: apache-kafka kafka-consumer-api
我相信,如果您的线程不受 CPU 限制(并且网络容量不足),那么在消费者方面可能会有所不同。假设 Kafka 代理或滞后消费者上有无限数据,因为在第二个示例中每个线程都从两个分区消费,因此与每个线程仅分配一个分区相比,kafka 代理能够发送更多数据。 Kafka 对每次提取可以检索的最大字节数有限制(配置中的replica.fetch.max.bytes),因此如果您将分区增加 2 倍,则可以在数据可用的情况下增加容量。
如果配置正确,并且假设条件理想,Kafka 将从页面缓存中提供数据,因此它可以将数据向下发送给消费者,90% 的时间,瓶颈将是消费者上的分区数量/可用 CPU边。一般来说,你拥有的分区越多,你从 Kafka 消费的速度就越快,直到你的 CPU 或带宽受限于消费者,此时你有更多或更少的分区并不重要,因为你正在消费数据尽可能快。
另外一个需要考虑的事情是,可能会有更多的消费者提交被发送回代理,因为现在有更多的分区,这意味着集群中有一些额外的开销/串扰。它可能不是 2 倍的提交,但可能高于第一个场景的 1 倍。
要记住的重要一点是,尽可能在您的消费者离线上进行实际的消息处理。也就是说,不在消费/轮询来自 Kafka 的同一线程上处理入站消息。一开始它可能会起作用,但是如果您的处理需要更长的时间,您将开始遇到问题,存在延迟,入站侧的大量增加等。只要有可能,将入站消息放在队列中,然后让另一个线程担心处理/解析它们。
最后,你不要把这个玩到极致,如果没有必要就配置 1000 个分区。每个分区都需要提交开销、zookeeper znode、消费者重新平衡时间、启动时间等。所以,我建议对不同的场景进行基准测试,看看什么最适合你。一般来说,过去每个消费者线程 2-4 个分区对我来说效果很好,即使消息负载非常高(主题每秒有 50K+ 消息,每个 ~1KB)。
【讨论】: