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



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

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

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

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

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

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

此操作的性能将取决于快照的频率。

最新更新