如何为Kafka生产者选择键和偏移

时间:2018-07-09 12:47:28

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

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

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

根据Google,

  

偏移量:一个Kafka主题会通过   存储它们的分区。每个分区维护   它已按顺序接收到的消息   由偏移量(也称为位置)标识。

对于我来说,似乎两者都很相似。由于偏移量在分区中保持唯一的消息:生产者根据记录的键将记录发送到分区

  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发送给定键值的实时数据流消息。因此,我想到了为PartitionKey和Offset使用该键。但是需要确保我对自己的想法是正确的。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这些是一些基本区别:

偏移量:由kafka维护,以跟踪消耗的记录,以避免在消耗时丢失记录和重复记录。

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