【问题标题】:How to choose a Key and Offset for a Kafka Producer如何为 Kafka Producer 选择 Key 和 Offset
【发布时间】:2018-12-17 03:53:34
【问题描述】:

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

  1. Key 和 offset 是否相同?

根据谷歌,

偏移量: 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。但需要确保我的想法是正确的。

【问题讨论】:

  • 您将源偏移量与内部 Kafka 偏移量混淆了,后者与 Kafka 消息键无关。请参阅 JavaDoc。 sourcePartition 表示记录来自的单个输入sourcePartition(例如文件名、表名或主题分区)。 sourceOffset 表示 sourcePartition 中的一个位置,可用于恢复数据的使用。 - 因此,除非您可以从 websocket 中的时间戳恢复,否则您实际上并不需要源偏移量作为该记录的一部分

标签: java apache-kafka apache-kafka-connect


【解决方案1】:

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

【讨论】:

  • Key选错了怎么办,分区不平衡又会是什么结果?
  • 我没有完全理解您选择错误的键的意思。如果您使用了不应该使用的密钥,那么该特定消息可能会转到不同的分区,仅此而已。对于分区不平衡,我的意思是一些分区会收到比其他分区更多的消息。因此,从这些分区消费的消费者会很忙,而其他人则大多是空闲的。
【解决方案2】:

这些是一些基本的区别:

Offset : 由 kafka 维护,用于跟踪消费的记录,以避免在消费时丢失记录和重复记录。

Key:特定于输入事件,如果它不可用,则默认为 null,这在使用 kafka connect 将记录写入具有默认分区器的 HDFS 时很有用。每条消息都可以有一个键或者许多消息可以具有相似的密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2016-12-06
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多