【发布时间】:2018-12-17 03:53:34
【问题描述】:
我正在关注here。同时关注代码。我想出了两个问题
- Key 和 offset 是否相同?
根据谷歌,
偏移量: Kafka 主题通过一组分布式接收消息 存储它们的分区。每个分区维护 它按顺序收到的消息 由偏移量标识,也称为位置。
对我来说似乎两者都非常相似。由于 offset 在分区中维护了一条唯一的消息:生产者根据记录的 key 将记录发送到分区
- 为制作人选择 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