Kafka倒序消费消息

Kafka consume message in reverse order

我使用 Kafka 0.10,我有一个主题 logs,我的物联网设备 post 在那里登录,我的消息的关键是 device-id,所以所有的日志同一设备在同一分区。

我有一个 api /devices/{id}/tail-logs 需要在调用时显示一个设备的 N 个最后日志。

目前我以一种非常低效的方式(但有效)实现了它,因为我从包含设备日志的分区的开头(即最旧的日志)开始,直到达到当前时间戳。

一种更有效的方法是,如果我可以获得当前最新的偏移量,然后向后使用消息(我需要过滤掉一些消息以仅保留我正在寻找的设备的消息)

kafka可以吗?如果不是,如何解决这个问题? (我会看到一个更繁重的解决方案是将 kafka-connect 链接到弹性搜索,然后查询弹性搜索,但是为此再增加 2 个组件似乎有点矫枉过正......)

由于您使用的是 0.10.2,我建议您编写一个 Kafka Streams 应用程序。该应用程序将是有状态的,并且该状态将保存每个 device-id 的最后 N records/logs —— 如果新数据写入输入主题,Kafka Streams 应用程序将只更新它的状态(不需要重新阅读整个主题)。

此外,该应用程序还可以满足您的要求("api /devices/{id}/tail-logs" 使用 Interactive Queries 功能。

因此,我不会构建一个必须为每个请求重新计算答案的无状态应用程序,而是构建一个有状态应用程序,它急切地为所有可能的请求计算结果(并始终自动更新结果)(即,对于所有 device-ids) 和只有 returns 请求进来时已经计算的结果。