共享 Kafka StateStore 最佳实践
Shared Kafka StateStore Best Practices
创建处理器时 API Topology
我注意到 Topology#addStateStore(StoreBuilder, String...)
接受多个处理器,这意味着一个状态存储可以由多个处理器共享。
这个设计有什么注意事项吗?
如果某个键不存在,而实际上其他处理器只是存储该键的值,是否有可能通过存储值丢失数据?
我想我是在问是否会出现通常的竞争条件问题。
如果处理器属于不同的子拓扑,会有什么不同吗?
此外,当连接到具有不同数量分区的源的处理器共享相同的状态存储时会发生什么?这将如何影响状态存储分片?
没有竞争条件。如果单个商店连接到多个处理器,则两个处理器都在单个线程中执行。
但是请注意,没有定义两个处理器访问存储的顺序,即,如果只有一个输入记录,您不知道哪个处理器将首先执行。
Would it be any different if processors belong to different sub topologies?
那是不可能的。如果两个处理器访问同一个存储,它们将始终处于相同的子拓扑中。
Also, what happens when processors attached to sources with a different number of partitions share the same state store? How will this affect state store sharding?
一般来说,不推荐这样做,因为您的输入数据不会被共同分区(即,具有相同键的记录很可能在两个主题的不同分区中)。该程序仍将使用较大的分区数来执行以创建存储分片。对于某些分片(对于较高的分区号),对应的任务只会从一个主题读取数据,因为另一个主题中没有对应的分区。
创建处理器时 API Topology
我注意到 Topology#addStateStore(StoreBuilder, String...)
接受多个处理器,这意味着一个状态存储可以由多个处理器共享。
这个设计有什么注意事项吗? 如果某个键不存在,而实际上其他处理器只是存储该键的值,是否有可能通过存储值丢失数据? 我想我是在问是否会出现通常的竞争条件问题。
如果处理器属于不同的子拓扑,会有什么不同吗?
此外,当连接到具有不同数量分区的源的处理器共享相同的状态存储时会发生什么?这将如何影响状态存储分片?
没有竞争条件。如果单个商店连接到多个处理器,则两个处理器都在单个线程中执行。
但是请注意,没有定义两个处理器访问存储的顺序,即,如果只有一个输入记录,您不知道哪个处理器将首先执行。
Would it be any different if processors belong to different sub topologies?
那是不可能的。如果两个处理器访问同一个存储,它们将始终处于相同的子拓扑中。
Also, what happens when processors attached to sources with a different number of partitions share the same state store? How will this affect state store sharding?
一般来说,不推荐这样做,因为您的输入数据不会被共同分区(即,具有相同键的记录很可能在两个主题的不同分区中)。该程序仍将使用较大的分区数来执行以创建存储分片。对于某些分片(对于较高的分区号),对应的任务只会从一个主题读取数据,因为另一个主题中没有对应的分区。