Kafka Streams:跨拓扑共享globalStateStore

时间:2019-03-14 09:34:27

标签: apache-kafka apache-kafka-streams spring-kafka

我有一个Spring Boot应用程序,该应用程序使用Processor API生成拓扑,还使用addGlobalStateStore到同一拓扑。

我想创建另一个拓扑(因此也要创建另一个KafkaStreams)以从另一组主题中读取,并希望在新拓扑中共享先前创建的存储。所谓共享,是指两种拓扑的基础状态存储都应该相同。从一种拓扑写入的任何数据都应在另一种拓扑中可见。

在不编写包装端点访问状态存储的情况下是否可行REST电话?

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

2 个答案:

答案 0 :(得分:1)

否,您不能在各种拓扑之间共享状态存储。相反,如果可能的话,您可以将拓扑分解为子拓扑,这将使其在定义的所有处理器中都可用。

如果您不能这样做,则可以使用外部存储。

答案 1 :(得分:0)

根据Stream Partitions and Tasks

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

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

您的方案的解决方案:

创建一个单独的KafkaStreams实例,其拓扑包含您将放置在2种不同拓扑中的所有内容。这将确定为整个拓扑创建单个task(由于该商店的使用);不会有子拓扑,因为您使用的是两个最初不同的拓扑所使用的存储。这也意味着整个拓扑只能由一个线程运行(这是主要缺点),不能在子拓扑中拆分而由多个线程运行-这并不意味着整个拓扑不能根据所选的并行性(num.stream.threads)由多个线程运行。