我有一个主题,其中包含每个会话的用户连接和断开事件。我想使用Kafka流来处理此主题并根据某些条件更新KTable。每个记录不能更新KTable。因此,我需要处理多个记录,以了解是否必须更新KTable。
例如,按用户然后按sessionid处理流和聚合。如果该用户的至少一个sessionid仅具有Connected事件,则必须将KTable更新为在线用户(
)。
如果用户的所有sessionId都有Disconnected事件,则必须将KTable更新为离线用户(如果尚未离线)。
如何实现这样的逻辑?
我们可以在所有应用程序实例中实现此KTable以便每个实例在本地都有此数据吗?
答案 0 :(得分:0)
听起来像是一个相当复杂的场景。
也许,在这种情况下最好使用处理器 API? KTable
基本上只是一个 KV 存储,并且使用处理器 API,允许您应用复杂的处理来决定是否要更新状态存储。 KTable
本身不允许您应用复杂的逻辑,但它会应用它收到的每个更新。
因此,使用 DSL,您需要进行一些 per-processing,如果您想更新 KTable
,请仅针对这种情况发送更新记录。像这样:
KStream stream = builder.stream("input-topic");
// apply your processing and write an update record into `updates` when necessary
KStream updates = stream...
KTable table = updates.toTable();