由于消息的吞吐量很高,我们增加了分区的数量以并行处理消息。一旦我们增加了分区的数量,所有订阅该主题的流线程就会死亡。我们更改了消费者组 ID,然后重新启动了它运行良好的应用程序。
我知道应用程序更改日志主题的分区数应该与源主题相同。我想知道这背后的原因。
找不到原因
基本上,这个 if 条件背后的原因。
最佳答案
输入主题分区定义并行级别,如果您有聚合或连接等有状态操作,则这些操作的状态在分片中。如果你有 X 个输入主题分区,你会得到 X 个任务,每个任务都有一个状态分片。此外,状态由 Kafka 中具有 X 个分区的更新日志主题支持,并且每个分片都只使用其中一个分区。
如果您将输入主题分区的数量更改为 X+1,Kafka Streams 会尝试使用 X 个存储分片创建 X+1 个任务,但是现有的变更日志主题只有 X 个分区。因此,应用程序的整个分区中断,Kafka Streams 无法保证正确处理,因此会因错误而关闭。
另请注意,Kafka Streams 假定输入数据是按键分区的。如果您更改输入主题分区的数量,基于散列的分区也会更改,这也可能导致不正确的输出。
一般情况下,建议一开始就过度划分主题以避免这个问题。如果您确实需要横向扩展,最好使用新的分区数创建一个新主题,并并行启动应用程序的副本(使用新的应用程序 ID)。之后,您更新上游生产者应用程序以写入新主题,最后关闭旧应用程序。
关于java - 为什么 kafka 流线程会在源主题分区更改时死亡?谁能指出这方面的阅读 Material ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54650298/