我有一个Kafka Streams应用程序,它从5个分区的一个Kafka主题中读取内容。
然后几次对数据进行聚合/重新分区。
在这种情况下,我试图找到有关线程数量的建议,但是很难理解。 documentation写道:
您可以启动与输入相同数量的应用程序线程 Kafka主题分区
在我的情况下,这意味着5个线程是有效线程的最大数量。
但是this blog声称重新分区使最大有效线程数增加了一倍:
...使用相同的主题自动创建 分区数作为源主题,这意味着我们的应用程序是 现在从具有8个线程的16个分区中读取数据,从而创建了某种 争执。
这对我来说也是合理的,因为Kafka Streams也必须阅读其创建的内部主题。
那么,有效线程的最大数量是5个分区还是5 *(重新分区)?
答案 0 :(得分:2)
您可以启动任意多个线程。但是,仅将使用一定数量的线程,而所有其他线程将处于空闲状态。
使用的最大线程数是创建的任务数。
将拓扑划分为子拓扑,每个子拓扑的输入主题分区的数量决定了每个子拓扑创建的任务数。如果配置备用任务,那么您还将获得可以利用线程的其他任务。
通常,很难预先知道Kafka Streams创建了多少个任务。您可以通过Topology#describe()
获取子拓扑。如果所有主题的分区数量相同,则任务数将为#numPartition * #numSubTopoogies
。
文档被有意简化了,因为确切的任务数量很难确定,因为存在许多依赖关系。而且,通常每个任务不需要线程,并且凭经验可以开始使用。