【问题标题】:How to get message by key from kafka topic如何从kafka主题中按键获取消息
【发布时间】:2019-02-10 15:14:27
【问题描述】:

我尝试通过密钥从 kafka 获取消息。我发现唯一的解决方案是使用 StateStore,但我认为这可能不是一个好主意。 如何从kafka主题中按键获取消息? 使用 StateStore 进行此操作是个好主意吗?

【问题讨论】:

    标签: java apache-kafka spring-kafka


    【解决方案1】:

    您不能“通过密钥从 Kafka 获取消息”。

    如果可行,一个解决方案是拥有与键一样多的分区,并始终将键的消息路由到同一分区。

    【讨论】:

    • 感谢您的回复。但是你觉得 StateStore 怎么样,它能解决我的问题吗?
    【解决方案2】:

    写入 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 不是按键索引的,它是按偏移量索引的,也可以通过timestamp 进行索引。如果您需要查找一个键,那么您需要将数据具体化到一个旨在通过键查找的系统:关系数据库、键值存储或某些索引。您可以使用 Kafka Connect 轻松完成此操作,或者如果您想将其构建到您的服务中,您可以使用 interactive queries feature of Kafka Streams。

    【讨论】:

    • 感谢您的回复。但是你觉得 StateStore 怎么样,它可以解决我的问题吗?
    • 关系数据库、键值存储、索引或交互式查询都是“状态存储”,本质上是 Kafka 主题中记录的具体化。这是基于键索引的唯一方法,因为 Kafka 不提供该功能,因此您必须使用其他一些按键索引的存储。如果你仔细想想,这实际上是 Kafka 的一个特性:使用最佳工具完成工作的敏捷性。
    • 使用默认的 RocksDBStore 是个好主意还是可能存在更好的解决方案?
    • 我上面链接的交互式查询功能实际上会自动实例化一个 RocksDB 状态存储,这是一个相当简单的解决方案,并且经过充分验证。
    • @ChrisMatta 考虑到 Kafka 设置有 1 个分区并且键是顺序 Long 类型值,有没有办法使用 KStream 实现 OP 的要求?
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2016-08-14
    • 2023-03-23
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2019-06-23
    相关资源
    最近更新 更多