我有一台服务器需要保留所有用户的内存缓存。因此,假设一个列表不会很大 - 几万个项目,我想使用带有键控消息的Kafka主题,其中key是userId以保持该列表的当前状态,管理应用程序将在更改内容时将新用户对象发送到该主题。因此,当服务器启动时,它只需要从头开始读取所有内容并填充它的缓存。
人口阶段大约需要20-30秒,具体取决于与Kafka的连接,因此服务器在从主题中读取所有内容以获得最新缓存之前不需要联机(主题中的所有消息都在开始时刻被认为是最新的)。但我不知道如何确定我是否从Kafka流中读取所有内容以通知其他服务缓存已填充且服务器可以启动服务器请求。我已经读过有关高水印但没有看到它在Java消费者API中暴露的内容。
那么如何找出Kafka主题的最新偏移量,以便知道我的读者何时是最新的?
答案 0 :(得分:5)
假设您正在使用高级消费者。
高级消费者无法获得高水印。
**As you mentioned: all the messages in the topic at the moment of start is considered up-to-date**
当您的应用程序启动时,您可以使用SimpleConsumer Api执行以下操作: -
通过向kafka集群中的任何代理发出TopicMetadataRequest来查找主题中的分区数。
创建分区到latestOffset映射,其中key是partition,value是该分区中可用的latestOffset。
地图<整数,整数> offsetMap = new HashMap<>()
对于主题中的每个分区p:
一个。找到分区p的领导者
B中。向领导者发送OffsetRequest
℃。从OffsetResponse
获取最新的Offsetd。在offsetMap中添加一个条目,其中key是分区p,偏移量是 latestOffset。
使用高级消费者:
开始阅读来自kafka的消息一个。对于您从KafkaStream获得的每条消息:
AA. Get the partition && offset of the message
BB. if( offsetMap.get(partition)<=offset) stop Reading from this steam
希望这有帮助。