我有一个Processor-API处理器,它内部转发到几个独立的接收器(想想事件分类器,尽管事件之间也有状态逻辑)。我想在之后的两个主题之间加入。一旦建立了连接,我就会将更新(丰富)的元素版本转发给我实际加入的主题。
如果在您的处理器API代码中转发到多个接收器(sink1,sink2),然后将其发送到主题,您将如何混合使用DSL?
我猜你可以创建单独的流,比如
val stream1 = builder.stream(outputTopic)
val stream2 = builder.stream(outputTopic2)
从那里建造?然而,这会产生更多的子拓扑 - 这是影响吗?
另一种可能性是在处理器API中拥有自己的状态存储并在那里管理它,在同一个处理器中(我实际上是这样做的)。它增加了代码的复杂性,但它不会更有效吗?例如,您可以删除不再使用的数据(一旦建立连接,您可以将新的连接数据转发到接收器,并且它不再符合加入条件)。任何其他效率问题?
答案 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提供的连接运算符。