Apache kafka Kafka Streams:跨拓扑共享globalStateStore

Apache kafka Kafka Streams:跨拓扑共享globalStateStore,apache-kafka,apache-kafka-streams,spring-kafka,Apache Kafka,Apache Kafka Streams,Spring Kafka,我有一个Spring引导应用程序,它使用处理器API生成拓扑,还为同一拓扑生成一个addGlobalStateStore 我想创建另一个拓扑(从而创建另一个KafkaStreams)以从另一组主题中读取,并想在新拓扑中共享先前创建的存储。共享意味着两种拓扑的底层状态存储应该相同。从一个拓扑写入的任何数据都应该在另一个拓扑中可见 如果不编写包装器端点来访问状态存储(例如REST调用),这是否可能 或者我的用例是否需要外部状态存储,例如redis?不,您不能跨拓扑共享状态存储。如果可能的话,您可以将

我有一个Spring引导应用程序,它使用处理器API生成拓扑,还为同一拓扑生成一个addGlobalStateStore

我想创建另一个拓扑(从而创建另一个KafkaStreams)以从另一组主题中读取,并想在新拓扑中共享先前创建的存储。共享意味着两种拓扑的底层状态存储应该相同。从一个拓扑写入的任何数据都应该在另一个拓扑中可见

如果不编写包装器端点来访问状态存储(例如REST调用),这是否可能


或者我的用例是否需要外部状态存储,例如redis?

不,您不能跨拓扑共享状态存储。如果可能的话,您可以将拓扑分解为子拓扑,这将使它在定义的所有处理器中都可用

如果您无法做到这一点,可以使用外部存储

根据:

子拓扑(也称为子图):如果存在多个 Kafka Streams应用程序中指定的处理器拓扑,每个 任务仅实例化一个拓扑以进行处理。在里面 此外,单处理器拓扑可以分解为 独立子拓扑(或子图)。子拓扑是一组 处理器,所有处理器都以父级/子级或 通过拓扑中的状态存储。因此,不同的子拓扑 通过主题交换数据,不共享任何状态存储。每项任务 只能实例化一个这样的子拓扑进行处理。这 进一步将计算工作量扩展到多个任务

这意味着子拓扑(因此也是拓扑)不能共享任何状态存储

针对您的场景的解决方案:


创建一个单独的
KafkaStreams
实例,其拓扑包含您在两个不同拓扑中放置的所有内容。这将决定为整个拓扑创建单个拓扑(因为该存储使用);将不存在子拓扑,因为您使用的存储由两个最初不同的拓扑使用。这也意味着整个拓扑只能由一个线程运行(这是主要缺点),不能拆分为子拓扑由多个线程运行-这并不意味着拓扑作为一个整体不能由多个线程运行,这取决于所选的并行度().

我认为您不能在拓扑之间共享状态存储。但是,您必须将两种拓扑合并为一种拓扑。