我们只说2个主题
用户{'UserId',{'UserName','Age'}
帖子{'PostId',{'UserId','Post Data','Post Date'}}
我想按特定日期的任何特定用户名来计算当前的帖子总数。 (不是通过userId)
我有一个执行此聚合的流应用程序。
用户有权更改任何数据,每当用户进行任何更改时,都会在Kafka中记录一个新事件。
在我的流应用程序逻辑中,Posts KStream与Users KTable之间存在联接。但是,Users KTable中的条目可能在Posts KStream条目之后。定义拓扑的方式是:如果(左侧)联接失败,则将帖子发送到另一个名为“ Missed-Posts”的主题,以便一旦用户可用,便可以执行联接。如果联接成功,则联接的数据结构将传递到另一个主题,例如“联接的帖子”。
现在,为了迎合错过的帖子,我与Users KStream一起执行windowedJoin。因此,一旦我收到用户的信息,便将其与相应的Missed-Post(如果有的话)一起加入,并将加入的帖子推送到“ Joined-Posts”主题中。
“发布数据”或“发布日期”中的任何后续更新都将被正确推送到“已加入的帖子”中,“已加入的帖子”上的聚合逻辑将正常工作。
现在,我们只说有一个“用户1”发来的帖子被漏掉了,例如{'Post1',{'1st Jan','Hello'}。首先,在一段时间后用户信息可用后,将其推送到“错过的帖子”,然后推送到“已加入的帖子”。
用户将发布日期从“ 1月1日”更改为“ 1月2日”。这次联接成功(因为用户信息在Ktable中),并直接推送到Joined-Posts。因此,我们的Joined Posts KTable将具有一个新的条目{'PostId',{'User1Name','Hello','2nd Jan'}}。我们的聚合逻辑在这里也能很好地发挥作用。
当用户在窗口期内更改用户信息时,就会出现问题。现在,如果用户更改了年龄,则流应用程序中引发的事件将再次将该事件加入到错过的帖子中,并将{PostId,{'UserName','Hello','1st Jan'}}推送到Joined-Posts KTable中,仍然存在于“错过的帖子”中的过时帖子。因此,Ktable中的新Entry被Missed-Post流保持的旧旧值替换。这会弄乱聚合逻辑。
希望这能解释我的问题。我探索了许多选择,但是所有选择都以某种或其他方式失败。我可能不知道某些可以帮助我解决这种情况的Kafka Streams功能。
我觉得我确实缺少一些明显的东西。
如果有人需要,我可以提供代码示例。