当流应用程序有多个实例时,有状态操作如何在 Kafka 流中工作?
How does stateful operations work in Kafka streams when there are multiple instances of the stream app?
状态完整操作如何在具有多个实例的 Kafka Stream 应用程序中工作?
假设我们有 2 个主题,每个主题有 2 个分区 A 和 B。
我们有一个流应用程序,它从两个主题中消费并且两个流之间有一个连接。
现在我们有 运行 这个流应用程序的 2 个实例。据我了解,每个实例都将分配给每个主题的 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-guide-dsl-joins
状态完整操作如何在具有多个实例的 Kafka Stream 应用程序中工作? 假设我们有 2 个主题,每个主题有 2 个分区 A 和 B。 我们有一个流应用程序,它从两个主题中消费并且两个流之间有一个连接。
现在我们有 运行 这个流应用程序的 2 个实例。据我了解,每个实例都将分配给每个主题的 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-guide-dsl-joins