我正在尝试使用一个用例,该用例需要从1分钟的kafka主题处理消息。 在kafka中有没有办法只读取1分钟的消息?
提前致谢。
答案 0 :(得分:3)
简短的回答是否定的。 Kafka消费者的消费基于获取队列中的最新消息或最早的消息。 See the docs (搜索auto.offset.reset)
我认为你应该做的是在你的消费应用程序中保留一个消息缓冲区。使您的缓冲区仅保留1分钟的消息并丢弃超过1分钟的消息。这样,缓冲区中最旧的消息总是1分钟。
我是怎么做的。
答案 1 :(得分:2)
您可以利用0.11.0.0中引入的reset offset tooling。一个问题是它是一个命令行工具,它还没有编程API(还)。但您可以将应用程序与工具同步(或使用应用程序中的工具)将分区的偏移量重置为1分钟前从那里消耗:
$ bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --reset-offsets --group test.group --topic foo:0,1 --by-duration P1M
这会将主题foo
的分区0和1的偏移量重置为1分钟前的时间戳记中每个分区中的第一条消息。您可以检查邮件的时间戳,以确定它是否符合处理条件(根据您的使用案例)。
答案 2 :(得分:1)
您将能够使用Kafka Streams,状态存储和处理器执行此操作。以下解决方案可帮助您在1分钟后处理消息,但您仍将立即使用消息。
创建状态存储并将其添加到流构建器。使用该构建器创建流,并使用上面创建的状态存储添加处理器。使用处理器供应商处理您的每条消息。您可以使用process()将所有消息保存在状态存储中。将punctuate()安排到60000毫安并使punctuate()获得通过1分钟延迟的消息并处理它们。
希望这有帮助。