Kafka基于键/值对的消息传递的目的是什么?[关闭]


97

所有的例子卡夫卡| 生产者显示ProducerRecord的键/值对不仅具有相同的类型(所有示例均显示<String,String>),而且具有相同的。例如:

producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));

但是在Kafka文档中,我似乎找不到解释键/值概念(及其潜在目的/效用)的地方。在传统的消息传递中(ActiveMQ,RabbitMQ等),我总是在特定的主题/队列/交换中触发一条消息。但是,Kafka是第一个似乎要求键/值对而不只是常规字符串的消息的经纪人。

所以我问:要求生产者发送KV对的目的/用途是什么?

Answers:


95

Kafka使用由分区组成的分布式日志的抽象。将日志拆分为多个分区可以扩展系统。

用于确定日志中要附加消息的分区。而该值是消息的实际有效负载。在这方面,示例实际上不是很好。通常,您会使用复杂的类型作为值(例如元组类型或JSON或类似类型),并且会提取一个字段作为键。

请参阅:http : //kafka.apache.org/intro#intro_topicshttp://kafka.apache.org/intro#intro_producers

通常,键和/或值也可以是null。如果密钥是null随机分区,则将其选中。如果值为,则在启用某个主题的日志压缩而不是日志保留策略的情况下null可以具有特殊的“删除”语义(http://kafka.apache.org/documentation#compaction)。


2
而值得注意的是,按键也卡夫卡的流API中起到相应部分,与KStreamKTable-见这里
reim

12
密钥用于确定分区,但这只是生产者的默认策略。最终,由生产者选择要使用的分区。
gvo

@gvo钥匙有更多用途吗?
leoconco

1
如日志压缩链接中所述,它可用于每个密钥仅保留一个消息实例。我不知道其他用例。
gvo

2
如果指定该partition参数,它将被使用,并且该键将被“忽略”(当然,该键仍将被写入主题)。-这使您即使具有键也可以具有自定义分区。
Matthias J. Sax

17

后期添加...如果在主题的使用者组中有多个使用者,则指定键以使同一键上的所有消息都进入同一分区对于正确处理消息处理非常重要。

如果没有密钥,则同一密钥上的两条消息可能会转到不同的分区,并由该组中的不同使用者处理。


-1

另一个有趣的用例

我们可以在Kafka主题中使用key属性发送user_id,然后可以插入使用者以获取流事件(事件存储在value属性中)。这可以让您处理用户事件序列的任何最大历史记录,以在您的机器学习模型中创建功能。

我仍然必须找出这是否可行。将继续更新我的答案,并提供更多详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.