Kafka Streams:流任务在应用程序实例之间移动

时间:2018-06-28 23:20:38

标签: apache-kafka apache-kafka-streams

考虑使用具有状态存储的6个分区的输入主题来设置流应用程序。假设每小时持续有超过500万条记录流入。如果应用程序在单个节点上运行,则所有传入记录的状态都将保留在同一节点上。现在,如果我们在不同的节点上添加另一个实例,我假设它会相等地平衡两个实例之间的分区(假设我们将每个实例的最大线程数设置为3)。

我想我的问题是何时发生重新平衡,并且如果一个分区实例从一个实例移到另一个实例,反之亦然,这将导致针对这些分区在其各自实例上的状态存储进行还原,这需要时间。由于重新平衡而导致实例之间的分区的频繁改组(尤其是大量)不是主要的开销,并且会影响流传输性能。我不确定是否可以完全阻止重新平衡(据我了解是为了获得负载平衡的好处),但这是否不能防止使用存储的同一主题的多个实例进行扩展?

1 个答案:

答案 0 :(得分:0)

Kafka Streams使用自己的PartitionAssignor实现(不是KafkaConsumer使用的默认实现)并实现粘性分配策略。在重新平衡期间,已知哪些分区已分配给哪个KafkaStreams实例,并且如果可能的话,我们将尝试将分区重新分配给同一实例,以避免状态移动。负载平衡当然也起到了扩展场景的作用。