Java Kafka KStream-拓扑设计
我的流是键/值对,我希望通过60秒的聚合以“原始”的形式保存到数据库中。最初我是这样做的:Java Kafka KStream-拓扑设计,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我的流是键/值对,我希望通过60秒的聚合以“原始”的形式保存到数据库中。最初我是这样做的: ->foreach / kStreamBuilder.stream->aggregateBy->process 但后来我发现 a.aggregateby()只返回它匹配的对(我需要所有对-匹配或其他) B我可以在.process()阶段使用HashMap实现相同的聚合效果。然后,当调用.sparen
->foreach
/
kStreamBuilder.stream->aggregateBy->process
但后来我发现
a.aggregateby()
只返回它匹配的对(我需要所有对-匹配或其他)B我可以在
.process()
阶段使用HashMap实现相同的聚合效果。然后,当调用.sparente()
时,我将所有k/v对写入数据库
因此,结果拓扑变为:
kStreamBuilder.stream->foreach
kStreamBuilder.stream->process
问题:
.foreach()
和.process()
之前,我是否需要(以某种方式)对其进行分割,或者这样做就足够了DSL层中的聚合是为“增量聚合”而设计的,即当前聚合结果加上要“添加”的单个新值。如果您想一次访问60秒窗口的所有“原始记录”,则需要使用处理器API
如果有两个下游操作符,则无需执行任何操作。记录将自动转发给这两个服务器。但是,请记住,它们不是复制的,也就是说,两个下游操作员将看到每个记录的相同Java对象 您所指的聚合方法是什么?卡夫卡0.10.0中没有这样的方法。你说的“匹配”是什么意思?您在上面所做的是聚合单个流——我不了解您所匹配的内容。最后,一般来说,我建议不要使用
foreach()
转发来自卡夫卡(和卡夫卡流应用程序)的数据;改用卡夫卡连接。一个原因是:Kafka和Kafka Streams很快就会有精确的一次语义,但如果使用foreach()
(b/c此方法是流的黑盒),Kafka->DB管道将失去端到端精确的一次语义。我的错误-它应该引用我想要的结果。.forEach
将记录每个单独的记录,.process
将对多次出现的任何记录进行配对,并将所有内容写入聚合存储。