java - 如何为 Kafka Producer 选择 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。但需要确保我的想法是正确的。
解决方案
Key 是可选的元数据,可以与 Kafka 消息一起发送,默认情况下,它用于将消息路由到特定分区。例如,如果您要向具有p分区的主题mytopic发送消息m,其键为k ,那么m会转到mytopic中的分区 Hash( k ) % p。它与分区的偏移量无关。消费者使用偏移量来跟踪分区中最后读取消息的位置。在你的情况下,如果时间戳是相当随机分布的,那么它很好,否则你可能会在使用它作为键时导致分区不平衡。
推荐阅读
- laravel - Laravel 文件管理器无法在生产环境中工作
- android - 如何实现现代的 Android Navigation 实现
- pdo - 关于driver_options,我还是不知道数字之间的对应关系
- python - 为什么基本代码不会在 Jupiter 中执行(import pandas as pd)?
- vba - 从表单上的文本框填充 Access 报告上的文本框
- c# - Blazor 错误:“没有注册类型的服务”——其他 StackOverflow 问题没有解决
- angular - 如何在Angular中的路由之间传递非字符串对象?
- algorithm - 我如何在流程图中显示这个?
- generics - 对于必须实现“iter”函数的类型,我应该使用哪个特征绑定
- python - 如何从python中的列表中分配等级