为什么 kafka 流线程在源主题分区更改时死亡?任何人都可以指出阅读材料吗?

kar*_*153 8 java apache-kafka apache-kafka-streams

由于消息的吞吐量很高,我们增加了分区的数量以并行处理消息。一旦我们增加了分区的数量,订阅该主题的所有流线程就会死亡。我们更改了消费者组 ID,然后我们重新启动了它运行良好的应用程序。

我知道应用程序的分区更改日志主题的数量应该与源主题相同。我想知道这背后的原因。

我看到了这个链接 - https://issues.apache.org/jira/browse/KAFKA-6063?jql=project%20%3D%20KAFKA%20AND%20component%20%3D%20streams%20AND%20text%20~% 20%22分区%22

找不到原因

https://github.com/apache/kafka/blob/fdc742b1ade420682911b3e336ae04827639cc04/streams/src/main/java/org/apache/kafka/streams/processor/internals/InternalTopicManager.java#L122

基本上,这背后的原因 if 条件。

Mat*_*Sax 5

输入主题分区定义并行级别,如果您有有状态的操作,如聚合或连接,则这些操作在分片中的状态。如果您有 X 个输入主题分区,您将获得 X 个任务,每个任务都有一个状态分片。此外,状态由具有 X 个分区的 Kafka 中的更改日志主题支持,并且每个分片都使用这些分区中的一个。

如果将输入主题分区的数量更改为 X+1,Kafka Streams 会尝试使用 X 个存储分片创建 X+1 个任务,但是现有的更改日志主题只有 X 个分区。因此,应用程序的整个分区会中断,并且 Kafka Streams 无法保证正确处理,因此会因错误而关闭。

另请注意,Kafka Streams 假设输入数据按键进行分区。如果您更改输入主题分区的数量,基于哈希的分区也会更改可能导致错误输出的内容。

一般来说,建议在开始时对主题进行过度分区以避免此问题。如果确实需要横向扩展,最好使用新的分区数创建一个新主题,并并行启动应用程序的副本(具有新的应用程序 ID)。之后,您更新上游生产者应用程序以写入新主题,最后关闭旧应用程序。