我是 Kafka 的新手,我们的团队正在研究服务间通信的模式。
目标
我们有两个服务,P(生产者)和 C(消费者)。P 是 C 需要的一组数据的真实来源。当 C 启动时,它需要将所有当前数据从 P 加载到它的缓存中,然后订阅更改通知。(换句话说,我们希望在服务之间同步数据。)
数据总量比较少,变化不频繁。同步的短暂延迟是可以接受的(最终一致性)。
我们希望将服务解耦,这样 P 和 C 就不需要相互了解。
提案
当 P 启动时,它会将其所有数据发布到启用了日志压缩的 Kafka 主题。每条消息都是一个聚合,其 ID 为一个键。
当 C 启动时,它会从主题的开头读取所有消息并填充其缓存。然后它会继续从其偏移量中读取以收到更新通知。
当 P 更新其数据时,它会为已更改的聚合发布一条消息。(此消息与原始消息具有相同的架构。)
当 C 收到一条新消息时,它会更新其缓存中的相应数据。
约束
我们正在使用Confluent REST 代理与 Kafka 进行通信。
问题
当 C 启动时,它如何知道它何时从主题中读取了所有消息,以便它可以安全地开始处理?
如果 C 没有立即注意到 P 一秒钟前发送的消息,这是可以接受的。如果 C 在消费一小时前 P 发送的消息之前开始处理,这是不可接受的。请注意,我们不知道何时会更新 P 的数据。
我们不希望 C 在消费每条消息后必须等待 REST 代理的轮询间隔。