此问题与KSQL或流处理技术的聚合视图有关。当我们接收事件时,我们将应用group by子句对事件进行汇总。现在发生了一个事件,它是对先前某个事件的更正。这将使我的聚合视图处于不一致状态。这不是乱序事件到达的情况。例如。我有一个事件(e),由实体ID(t),类别(c)和数量(q)属性组成。 追踪事件
1) e1 —> t1, c1, q1
2) e2 -> t2, c2, q2
3) e3 -> t3, c1, q3
4) e4 -> t1, c1, q4 correction to e1
5) e5 -> t5, c2, q5
我的汇总视图将是按类别对数量分组的总和
c1 -> q1 + q3 + q4
c2 -> q2 + q5.
c1现在处于不一致状态。 c1应该仅是q3 + q4。
是否有任何解决此类问题的方法。我知道我可以将所有事件保留在某个缓存中,然后创建一个聚合视图,但这是实时数据,因此每次都需要刷新所有视图。
答案 0 :(得分:0)
在Kafka Streams中,您可以执行KStream#groupBy()#aggregate()#mapValue()
。 Aggregate()不会计算聚合,但会返回id-> value的Map。在mapValue()中,您可以计算Map的所有值的汇总。这样,当更新到达时,if将用Map中的新值替换旧值,而mapValue()将正确地重新计算聚合结果。