【发布时间】:2018-04-18 16:37:16
【问题描述】:
我们目前正在实现一个流程(使用 Kafka 处理器 API),我们需要将来自主题的 2 个相关事件(消息)的信息组合起来,然后转发这些组合信息。事件源自物联网设备,由于我们希望保持它们的顺序,源主题使用设备标识符作为键。这些事件还包含一个相关 ID:
键
{ deviceId: "..." }
留言
{ deviceId: "...", correlationId: "...", data: ...}
我们的第一种方法是创建一个具有连接状态存储的处理器,该状态存储使用关联 ID 作为键来存储每条传入消息。这使我们能够在 store 中查询传入消息的相关 ID,如果 store 中已经存在具有相同 ID 的消息,我们可以组合信息,转发新事件并从 store 中删除条目。因此,对于每个关联 ID,都会发生以下情况:在某个时间点,具有该 ID 的第一条消息被使用和存储,而在另一个时间点,具有该 ID 的第二条消息导致存储条目被删除。
状态键
{ correlationId: "..." }
状态值
{ event: { deviceId: "...", correlationId: "...", data: ... }}
但现在我们想知道 Kafka Streams 是如何处理不同的密钥的。我们正在使用微服务方法,并且将运行该服务的多个实例。商店由内部主题自动支持。考虑重新缩放服务实例,s.t.源主题和状态主题的分区被重新平衡。是否有可能将特定关联 ID 的分区分配给另一个服务而不是相应设备 ID 的分区?我们是否会遇到这样一种情况,即具有相同关联 ID 的第二个事件将被服务实例使用,而该服务实例无权访问已存储的第一个事件?
提前致谢!
【问题讨论】:
标签: apache-kafka apache-kafka-streams