Kafka key/value 基于对的消息传递的目的是什么?

What's the purpose of Kafka's key/value pair-based messaging?

所有 examples of Kafka | producers 都显示 ProducerRecord 的 key/value 对不仅是同一类型(所有示例都显示 <String,String>),而且 <String,String> 也是相同的 。例如:

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

但是在 Kafka 文档中,我似乎找不到解释 key/value 概念(及其基础 purpose/utility)的地方。在传统消息传递(ActiveMQ、RabbitMQ 等)中,我总是在特定的 topic/queue/exchange 处发送消息。但是 Kafka 是第一个似乎需要 key/value 对而不仅仅是常规的 ole 字符串消息的代理。

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

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

密钥 用于确定日志中将消息附加到的分区。而该值是消息的实际有效负载。在这方面,这些例子实际上并不十分"good";通常你会有一个复杂类型作为值(比如元组类型或 JSON 或类似类型),你会提取一个字段作为键。

参见:http://kafka.apache.org/intro#intro_topics and http://kafka.apache.org/intro#intro_producers

一般来说,键值 and/or 也可以是 null。如果键是 null,将选择一个随机分区。如果值为 null,它 可以 具有特殊的 "delete" 语义,以防您为主题启用日志压缩而不是日志保留策略(http://kafka.apache.org/documentation#compaction).

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

没有密钥,同一密钥上的两条消息可能会转到不同的分区,并由组中的不同消费者乱序处理。

另一个有趣的用例

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

我还得看看这是否可行。将继续使用更多详细信息更新我的答案。