从Kafka主题中按键获取消息的方法

22

我尝试从kafka获取关键字消息,发现唯一的解决方案是使用StateStore,但我认为这可能不是一个好主意。 如何从kafka主题按关键字获取消息? 对于此操作使用StateStore是否明智?

2个回答

21

每条写入Kafka的记录都可以选择性地拥有一个键(但不是必须的!)。可以通过多种方式访问该键:

控制台消费者:

$ kafka-console-consumer --bootstrap-server <servername>:9092 --topic topicname --from-beginning --property print.key=true --property key.separator=:

kafkacat:

$ kafkacat -b <servername>:9092 -C -t topicname -o beginning -K :

Java Consumer API:

ConsumerRecord#key()

Kafka的索引不是按键进行的,而是按偏移量进行的,还可以选择按时间戳进行索引。如果需要查找键,则需要将数据实现到已经设计为按键查找的系统中:关系型数据库、键值存储或某些索引。您可以使用Kafka Connect轻松地完成此操作,或者如果您想将其构建到服务中,则可以使用Kafka Streams的交互式查询功能


1
谢谢您的回复。但是您认为StateStore能否解决我的问题呢? - Іван Гладуш
1
关系型数据库、键值存储、索引或交互式查询都是“状态存储”,本质上是 Kafka 主题中记录的实体化。这是基于键进行索引的唯一方法,因为 Kafka 不提供该功能,您必须使用其他按键索引的存储。如果您考虑一下,这实际上是 Kafka 的一个特性:灵活使用最适合工作的工具。 - Chris Matta
1
使用默认的RocksDBStore是个好主意吗?还有更好的解决方案吗? - Іван Гладуш
我上面提到的交互式查询功能实际上会自动实例化一个RocksDB状态存储,这是一个相当简单且经过充分验证的解决方案。 - Chris Matta
@ChrisMatta,考虑到Kafka设置只有1个分区且键是顺序的Long类型值,是否有使用KStream实现OP所需功能的方法? - Govinda Sakhare

5

你不能从Kafka中"按键获取消息"。

一个解决方案,如果可行的话,是将分区数设置为键的数量,并始终将键的消息路由到同一分区。


1
谢谢您的回复。但是您认为StateStore能解决我的问题吗? - Іван Гладуш

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接