我正在尝试使用Kafka Steam来减少一系列数字,并且我只想在数据更改时进行记录。它可以完美运行,但是问题是,如果运行代码的服务已关闭,它就不会赶上kafka的数据。所以我猜解决方案是错误的? 我的代码:
KGroupedStream<String, JsonNode> groupedStream = filteredStream.groupByKey( Serdes.String(), jsonSerde);
KTable<String, JsonNode> reducedTable = groupedStream.reduce(
(aggValue, newValue) -> Calculate.newValue( newValue, aggValue, logger) ,/* adder */
"reduced-stream-store" /* state store name */);
KStream<String, JsonNode> reducedStream = reducedTable.toStream();
“计算”方法:
if (value != oldValue)
return value
else return null.
如果有评论/建议,谢谢
答案 0 :(得分:0)
return null
将删除结果表中的条目。因此,您的代码无法达到您的期望。
实际上,DSL运营商发出的是“更新时”而不是“变更时”,因此您不能将DSL用于您的用例。有一张票证建议添加“变化时发出”的语义(https://issues.apache.org/jira/browse/KAFKA-8770)。
作为一种解决方法,您将需要使用带有状态存储的自定义transform()
。对于每个输入记录,您检查它是否存在于商店中。如果否,则发出记录并将其放入存储中。如果if存在并且相同,则不发出任何东西。如果不同,则发出并更新商店。