Apache kafka 卡夫卡以相反的顺序使用消息

Apache kafka 卡夫卡以相反的顺序使用消息,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我使用Kafka 0.10,我有一个主题日志,我的物联网设备将其日志发布到其中,我的消息的关键是设备id,因此同一设备的所有日志都在同一分区中 我有一个api/devices/{id}/tail logs,它需要显示调用时一个设备的N个最后日志 目前,我以一种非常低效的方式实现了它(但仍在工作),因为我从包含设备日志的分区的开始(即最早的日志)开始,直到到达当前时间戳为止 一个更有效的方法是,如果我能得到当前最新的偏移量,然后向后使用消息(我需要过滤掉一些消息,只保留我正在寻找的设备的消息) 有

我使用Kafka 0.10,我有一个主题
日志
,我的物联网设备将其日志发布到其中,我的消息的关键是
设备id
,因此同一设备的所有日志都在同一分区中

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

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

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


有可能和卡夫卡一起做吗?如果没有,如何解决这个问题?(我会看到一个更为繁重的解决方案是将kafka连接链接到弹性搜索,然后查询弹性搜索,但为此再添加两个组件似乎有点过分…

由于您使用的是0.10.2,我建议编写一个kafka Streams应用程序。应用程序将是有状态的,并且该状态将保存每个
设备id的最后N条记录/日志
——如果新数据写入输入主题,Kafka Streams应用程序将只更新其状态(无需重新读取整个主题)

此外,该应用程序还使用该功能为您提供请求(“api
/devices/{id}/tail log


因此,我不会构建一个无状态的应用程序,它必须为每个请求重新计算答案,而是构建一个有状态的应用程序,它急切地为所有可能的请求(即所有
设备id
s)计算结果(并随时自动更新结果)如果我完全理解您的应用程序,我不能100%确定。您“显示N个最后日志”,这基本上意味着来自主题或分区的N条最后消息?主题“日志”有多少个分区?如何定义“最后N条消息”如果有多个分区?这与时间戳有什么关系,正如您所说的“从开始到[您]到达当前时间戳”?向后读取并不容易,但有
.seek()
.endOffsets()
.offsetForTimestamp()
您肯定可以利用此漏洞-为了给出完整答案,我需要更好地理解场景事实上我的问题不清楚,我已编辑,我从1个分区中读取了最后N条消息,但一个分区可能有多个
设备id的日志
s,因此读取最后N条消息似乎不够。如果可能有帮助,请使用Kafka流和交互式查询使您的API有状态:您使用的是哪种Kafka版本?0.10.0、0.10.1或0.10.2?是的,您是对的,实际上我想说的是,通过
我需要过滤掉一些消息,以仅保留我正在寻找的设备的消息,我正在使用0.10.2,并且仍然处于“概念验证”阶段阶段,所以如果我需要的是beta版,我可以等待。谢谢,查看交互式查询的链接,在您的评论中(我认为也可以放在这个答案中),它像手套一样适合这种需要