Kafka Streams - 处理器API - 转发到不同的主题

时间:2018-05-14 08:31:27

标签: apache-kafka apache-kafka-streams kafka-streams-scala

我有一个Processor-API处理器,它内部转发到几个独立的接收器(想想事件分类器,尽管事件之间也有状态逻辑)。我想在之后的两个主题之间加入。一旦建立了连接,我就会将更新(丰富)的元素版本转发给我实际加入的主题。

如果在您的处理器API代码中转发到多个接收器(sink1,sink2),然后将其发送到主题,您将如何混合使用DSL?

我猜你可以创建单独的流,比如

val stream1 = builder.stream(outputTopic) 
val stream2 = builder.stream(outputTopic2)

从那里建造?然而,这会产生更多的子拓扑 - 这是影响吗?

另一种可能性是在处理器API中拥有自己的状态存储并在那里管理它,在同一个处理器中(我实际上是这样做的)。它增加了代码的复杂性,但它不会更有效吗?例如,您可以删除不再使用的数据(一旦建立连接,您可以将新的连接数据转发到接收器,并且它不再符合加入条件)。任何其他效率问题?

1 个答案:

答案 0 :(得分:2)

最简单的方法可能是将处理器API与DSL混合使用StreamsBuilder并使用transform()

StreamsBuilder builder = new StreamsBuilder()
KStream[] streams = builder.stream("input-topic")
                           .transform(/* put your processor API code here */)
                           .branch(...);

KStream joined = streams[0].join(streams[1], ...);

首先将中间流写入主题并将其读回。您获得更多子拓扑的事实应该是无关紧要的。

可以通过状态手动进行连接,但很难正确编码。如果可能,我建议使用DSL提供的连接运算符。