代码之家  ›  专栏  ›  技术社区  ›  Jayendran

如何为卡夫卡制作人选择键和偏移量

  •  0
  • Jayendran  · 技术社区  · 6 年前

    我在跟踪 here 。同时遵循代码。我提出了两个问题

    1. 键和偏移量是否相同?

    据谷歌称,

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

    似乎两者对我都很相似。因为offset在分区中维护一条唯一的消息:生产者根据records键将记录发送到分区

    1. 为生产商选择键/偏移量的最佳方法是什么?

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

     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连接器来从第三方WebSocketAPI获取数据。API为给定的键值发送实时数据流消息。所以我想用这个键作为分区键和偏移量。但要确保我的想法是正确的。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Bitswazsky    6 年前

    密钥是一个可选的元数据,可以与Kafka消息一起发送,默认情况下,它用于将消息路由到特定分区。例如,如果你在发送信息 按键为 K ,主题 我的主题 P 分区,然后 转到分区哈希( K )% P 在里面 我的主题 .它与任何分区的偏移量都没有关系。偏移量被使用者用来跟踪分区中最后一条已读消息的位置。在您的例子中,如果时间戳是随机分布的,那么它是可以的,否则在将其用作键时可能会导致分区不平衡。

        2
  •  0
  •   BARATH    6 年前

    这些是一些基本区别:

    抵销:由卡夫卡维护,对消耗的记录进行跟踪,避免消耗时丢失记录和重复记录。

    密钥:它是特定于输入事件的,如果它不可用,那么在默认情况下,它被称为空,这在使用默认分区ER使用Kafka Connect将记录写入HDF时很有用。每个消息可以有一个密钥,或者许多消息可以有类似的密钥。