从多个 Kafka 分区读取并恢复原始顺序

Read from multiple Kafka partitions and recover original order

我正在开发一个使用 Kafka 作为分布式提交日志的系统。单线程 Kafka 生产者接收来自外部的请求,处理它们并将结果写入具有 4096 个分区的主题。分区的数量是根据下游消费者的要求来选择的。生产者有内部状态,它会随着收到新请求而演变,它会不时保存状态快照。

在极少数情况下,当生产者需要恢复时,它会读取快照,然后它需要按照生成消息的顺序从 Kafka 主题中读取消息。我知道这不是 Kafka 设计的工作方式。但由于这是一种特殊且罕见的情况,我想知道我是否可以一次从每个分区读取一批,在内存中对它们进行排序,然后应用到快照以得到最新状态?

编辑:要记住的事情。 1. 所有生成的消息都带有序列号,以便我可以订购它们。 2. 生产者是单线程设计的。

您可以手动实现它,但它不会是惯用的或特别高效的(即您应该考虑使用为事件溯源设计的数据存储)。

基本想法是让您的生产者进程将分区的偏移量作为快照的一部分进行维护(也可以使用消费者组,但应注意确保该消费者生活在偏移量主题的保留期,否则生产者“太可靠”的情况可能会导致令人讨厌的意外)然后让消费者寻找这些分区偏移量,从中读取 N 条消息(例如通过 poll)每个分区,从合并的 4096*N 消息中获取最低的连续 运行 序列号,然后迭代,直到达到每个分区的最大偏移量。

您需要小心 Kafka 的消息重复保证:至少您有要删除重复数据的序列号。

此功能的性能取决于您拍摄快照的频率。