状态完整操作如何在具有多个实例的Kafka Stream应用程序中工作? 假设我们有2个主题,每个A和B都有2个分区。 我们有一个流应用程序,它同时使用两个主题,并且两个流之间有一个连接。
现在,我们正在运行此流应用程序的2个实例。据我了解,每个实例将被分配每个主题的2个分区之一。
现在,如果要加入的消息被应用程序的不同实例占用,那么将如何进行加入?我无法解决这个问题。
尽管我已针对似乎确实正常工作的小型流应用程序对其进行了测试。是否可以一直在不考虑流应用程序中定义的拓扑类型的情况下,总是增加任何类型的应用程序的实例数量?
我可以阅读任何文件以了解其工作细节吗?
答案 0 :(得分:5)
最大并行度单位是分区数。如果运行的实例数超过分区数,则过多的实例将处于空闲状态。
加入操作应满足以下要求:
输入数据必须在加入时进行共分区。也就是说,要连接的输入主题应具有相同数量的分区。
两个主题都应具有相同的分区策略,以便具有相同键的记录可以传递到相同的分区。如果不同,则有机会丢失记录。
示例:如果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-guide-dsl-joins