共享的Kafka StateStore最佳做法

时间:2020-06-10 11:33:44

标签: apache-kafka apache-kafka-streams

在创建处理器API Topology时,我注意到Topology#addStateStore(StoreBuilder, String...) 接受多个处理器,这意味着一个状态存储可以由多个处理器共享。

此设计是否有任何警告? 如果实际上不存在某个键,而实际上某个其他处理器只是为该键存储值时,是否可能通过存储值来丢失数据? 我想我是在问是否会出现正常的比赛条件问题。

如果处理器属于不同的子拓扑,会有所不同吗?
此外,当连接到具有不同数量分区的源的处理器共享同一状态存储时,会发生什么情况?这将如何影响状态存储分片?

1 个答案:

答案 0 :(得分:1)

没有比赛条件。如果单个存储连接到多个处理器,则两个处理器都在单个线程中执行。

但是请注意,并没有定义两个处理器访问存储的顺序,即,如果只有一条输入记录,则您不知道将首先执行哪个处理器。

如果处理器属于不同的子拓扑,会有所不同吗?

那是不可能的。如果两个处理器访问同一存储,则它们将始终处于相同的子拓扑中。

此外,当连接到具有不同分区数量的源的处理器共享同一状态存储时,会发生什么情况?这将如何影响状态存储分片?

通常不建议这样做,因为您的输入数据不会被共同分区(即,具有相同键的记录很可能在两个主题的不同分区中)。该程序仍将使用较大的分区数来执行,以创建存储分片。对于某些分片(对于更高的分区号),由于另一主题中没有相应的分区,因此相应的任务只能从一个主题读取数据。