当流应用程序有多个实例时,有状态操作如何在Kafka流中工作?

Ank*_*ana 0 apache-kafka apache-kafka-streams

状态完整操作如何在具有多个实例的Kafka Stream应用程序中工作?让我们说我们有2个主题,每个A和B有2个分区.我们有一个流应用程序,它既消耗了两个主题,又有两个流之间的连接.

现在我们正在运行此流应用程序的2个实例.据我所知,每个实例将分配每个主题的2个分区之一.

现在,如果要连接的消息被应用程序的不同实例使用,联接将如何发生?我无法理解它.

虽然我测试了一个似乎工作正常的小流应用程序.我是否可以在不考虑流应用程序中定义的拓扑类型的情况下,始终增加任何类型应用程序的实例数量?

是否有任何文件可以让我了解其工作细节?

Nis*_*yal 6

最大并行度单位是分区数.如果运行的实例数多于分区数,则过多的实例将处于空闲状态.

连接操作应符合以下要求:

  1. 加入时必须对输入数据进行共同分区.这意味着,要连接的输入主题应具有相同数量的分区.

  2. 这两个主题应该具有相同的分区策略,以便具有相同键的记录可以传递到相同的分区.如果不同,则有可能丢失记录.

示例:如果topic1有2个分区且topic2有3个分区,Join(topic1,topic2)则由于不相等的分区而失败.一旦你重新分配主题,让我们说3.现在Join(topic1, topic2)将工作.您可以最大限度地利用3个任务进行此操作.每个分区将以内部主题的形式在状态存储中维护其状态.默认情况下,KStream使用RocksDB来存储状态.

在这里,您可以看到该过程通常如何用于状态转换: 在此输入图像描述

有关详细信息,请参阅以下内容:

https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Internal+Data+Management https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#streams -developer引导-DSL-加入