首页 > 解决方案 > Kafka Consumer - 分区范围的随机访问获取

问题描述

问题: 如何随机获取具有给定范围定义的 [partition, start offset, end offset] 的旧消息块。希望范围一次来自多个分区(每个分区一个范围)。这也需要在并发环境中得到支持。

到目前为止,我对解决方案的想法 我想我可以使用一个消费者池来实现并发,并且对于每个 fetch、useConsumer.seekConsumer.pollwith max.poll.records。但这似乎是错误的。不能保证我会得到完全相同的块,例如在消息被删除的情况下(使用日志压缩)。总的来说,这种 seek + poll 方法似乎不适合一次性随机获取。

我的用例: 像典型的消费者一样,我的消费者读取 10MB 的消息块并对其进行处理。为了处理该块,我在某种工作流程中将 3-20 个作业推送到不同的主题。现在,我的目标是避免一次又一次地将相同的内容推送到其他主题中。在我看来,最好推送对该块的引用。例如[Topic X / partition Y, start offset, end offset]。然后,在处理作业时,它将再次获取确切的块。

标签: apache-kafkakafka-consumer-api

解决方案


您的想法似乎不错,实际上是消费者 API 的唯一解决方案。一旦在偏移量之间删除消息,您将无能为力。

如果您确实需要每个可能的偏移范围之间的每条消息,那么您应该考虑使用该数据,因为它被主动生成到一些外部可索引的目标中,其中偏移扫描也是一种常见的操作。存在大量的 Kafka 连接器,以及大量的数据库或文件系统。但这里的要点是,我认为你可能不得不重新考虑你对这些“再处理”工作的选择


推荐阅读