首页 > 解决方案 > 如何为 Kafka Producer 选择 Key 和 Offset

问题描述

我在这里关注。同时关注代码。我想出了两个问题

  1. 密钥和偏移量是否相同?

据谷歌称,

偏移量: Kafka 主题通过存储消息的分布式分区集接收消息。每个分区按顺序维护它收到的消息,其中它们由偏移量标识,也称为位置。

似乎两者对我来说都非常相似。由于 offset 在分区中维护了唯一的消息:生产者根据记录的 key 将记录发送到分区

  1. 为制作人选择 Key/Offset 的最佳方式是什么?

对于我上面提供的示例,他们选择了时间戳作为键和偏移量。这总是最好的建议吗?

 class IRCMessageListener extends IRCEventAdapter {
    @Override
    public void onPrivmsg(String channel, IRCUser u, String msg) {
        IRCMessage event = new IRCMessage(channel, u, msg);
        //FIXME kafka round robin default partitioner seems to always publish to partition 0 only (?)
        long ts = event.getInt64("timestamp");
        Map<String, ?> srcOffset = Collections.singletonMap(TIMESTAMP_FIELD, ts);
        Map<String, ?> srcPartition = Collections.singletonMap(CHANNEL_FIELD, channel);
        SourceRecord record = new SourceRecord(srcPartition, srcOffset, topic, KEY_SCHEMA, ts, IRCMessage.SCHEMA, event);
        queue.offer(record);
    }

因为我实际上是在尝试创建一个自定义 Kafka 连接器来从 3rd Party WebSocket API 获取数据。API 针对给定的 Key 值发送​​实时数据流消息。所以我想用那个 Key 作为我的 PartitionKey 和 Offset。但需要确保我的想法是正确的。

标签: javaapache-kafkaapache-kafka-connect

解决方案


Key 是可选的元数据,可以与 Kafka 消息一起发送,默认情况下,它用于将消息路由到特定分区。例如,如果您要向具有p分区的主题mytopic发送消息m,其键为k ,那么m会转到mytopic中的分区 Hash( k ) % p。它与分区的偏移量无关。消费者使用偏移量来跟踪分区中最后读取消息的位置。在你的情况下,如果时间戳是相当随机分布的,那么它很好,否则你可能会在使用它作为键时导致分区不平衡。


推荐阅读