Kafka Streams:跨应用程序实例移动流任务
Kafka Streams: Stream tasks moving across app instances
考虑具有 6 个分区的输入主题的流应用程序设置,该分区具有状态存储。假设每小时有超过 500 万条记录不断流入。如果应用程序在单个节点上 运行,则所有传入记录的状态都保留在同一节点中。现在,如果我们在不同的节点上添加另一个实例,我假设它会平等地平衡两个实例之间的分区(假设我们在每个实例中将最大线程设置为 3)。
我想我的问题是重新平衡何时发生,如果一个分区实例从一个实例移动到另一个实例,反之亦然,这将导致这些分区在各自实例上恢复状态存储,这需要时间。由于重新平衡,实例之间的分区(尤其是大量实例)的频繁洗牌是否会成为主要开销并影响流式传输性能。我不确定是否有可能完全阻止重新平衡(我理解这是为了负载平衡的好处),但这是否会阻止使用商店的同一主题使用多个实例进行扩展?
Kafka Streams 使用自己的 PartitionAssignor
实现(不是 KafkaConsumer
使用的默认实现)并实现粘性分配策略。在重新平衡期间,已知哪些分区被分配给了哪些 KafkaStreams
实例,并且如果可能的话,我们会尝试将分区重新分配给同一实例以避免状态移动。当然,负载平衡也可以实现扩展场景。
考虑具有 6 个分区的输入主题的流应用程序设置,该分区具有状态存储。假设每小时有超过 500 万条记录不断流入。如果应用程序在单个节点上 运行,则所有传入记录的状态都保留在同一节点中。现在,如果我们在不同的节点上添加另一个实例,我假设它会平等地平衡两个实例之间的分区(假设我们在每个实例中将最大线程设置为 3)。
我想我的问题是重新平衡何时发生,如果一个分区实例从一个实例移动到另一个实例,反之亦然,这将导致这些分区在各自实例上恢复状态存储,这需要时间。由于重新平衡,实例之间的分区(尤其是大量实例)的频繁洗牌是否会成为主要开销并影响流式传输性能。我不确定是否有可能完全阻止重新平衡(我理解这是为了负载平衡的好处),但这是否会阻止使用商店的同一主题使用多个实例进行扩展?
Kafka Streams 使用自己的 PartitionAssignor
实现(不是 KafkaConsumer
使用的默认实现)并实现粘性分配策略。在重新平衡期间,已知哪些分区被分配给了哪些 KafkaStreams
实例,并且如果可能的话,我们会尝试将分区重新分配给同一实例以避免状态移动。当然,负载平衡也可以实现扩展场景。