我在这里。在遵循代码时。我想出了两个问题
- 密钥和偏移量是否相同?
根据谷歌,
偏移量:Kafka 主题通过分布式 存储它们的分区。每个分区都维护 它按顺序接收的消息,它们所在的位置 由偏移量标识,也称为位置。
似乎两者对我来说非常相似。由于偏移量在分区中维护唯一的消息:生产者根据记录的键将记录发送到分区
- 为生产者选择键/偏移量的最佳方法是什么?
对于我上面提供的示例,他们选择了时间戳作为键和偏移量。 这总是最好的建议吗?
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 连接器来从第三方 WebSocket API 获取数据。API 针对给定的键值发送实时数据流消息。因此,我想将该键用于我的分区键和偏移量。但需要确保我的想法是正确的。
Key 是一个可选的元数据,可以与 Kafka 消息一起发送,默认情况下,它用于将消息路由到特定分区。 例如,如果您要将键为 k 的消息 m 发送到具有 p 个分区的主题 mytopic,则m转到分区 Hash(k( %pinmytopic.它与分区的偏移量没有任何联系。使用者使用偏移量来跟踪分区中上次读取消息的位置。在您的情况下,如果时间戳是相当随机分布的,那么没关系,否则在将其用作键时可能会导致分区不平衡。
这些是一些基本的区别:
偏移量:由kafka维护,以跟踪消耗的记录,以避免在使用时丢失记录和重复记录。
key:它特定于输入事件,如果不可用,则默认将其称为null,这在使用kafka connect使用默认分区器将记录写入HDFS时很有用,每条消息可以有一个键,或者许多消息可以具有相似的键。