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

时间:2019-01-18 10:12:45

标签: apache-kafka apache-kafka-streams

状态完整操作如何在具有多个实例的Kafka Stream应用程序中工作? 假设我们有2个主题,每个A和B都有2个分区。 我们有一个流应用程序,它同时使用两个主题,并且两个流之间有一个连接。

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

现在,如果要加入的消息被应用程序的不同实例占用,那么将如何进行加入?我无法解决这个问题。

尽管我已针对似乎确实正常工作的小型流应用程序对其进行了测试。是否可以一直在不考虑流应用程序中定义的拓扑类型的情况下,总是增加任何类型的应用程序的实例数量?

我可以阅读任何文件以了解其工作细节吗?

1 个答案:

答案 0 :(得分:5)

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

加入操作应满足以下要求:

  1. 输入数据必须在加入时进行共分区。也就是说,要连接的输入主题应具有相同数量的分区。

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

示例:如果topic1具有2个分区,而topic2具有3个分区,则Join(topic1,topic2)将因分区不相等而失败。重新分配主题后,让我们说3。 现在Join(topic1, topic2)将起作用。您最多可以利用3个任务进行此操作。每个分区将以内部主题的形式在状态存储中维护其状态。默认情况下,KStream使用RocksDB存储状态。

在这里,您可以看到流程通常用于有状态转换的过程: enter image description here

请参阅以下详细信息:

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-guide-dsl-joins