卡夫卡基于键/值对的消息传递的目的是什么?

卡夫卡 | 制片人的所有 例子都显示 ProducerRecord的键/值对不仅是相同的类型(所有示例都显示 <String,String>) ,而且是相同的 价值。例如:

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

但是在卡夫卡的文档中,我似乎找不到键/值概念(及其潜在的用途/实用程序)的解释。在传统的消息传递(ActiveMQ、 RabbitMQ 等)中,我总是在特定的主题/队列/交换中激发消息。但是卡夫卡是第一个似乎需要键/值对而不仅仅是一个普通的‘ ole 字符串消息’的代理。

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

64007 次浏览

卡夫卡使用由 分区组成的分布式 木头的抽象。将日志分割成多个分区可以扩展系统。

用于确定消息 get 所附加到的日志中的分区。而值是消息的实际有效负载。在这方面,这些示例实际上并不是非常“好”; 通常您将有一个复杂的类型作为值(比如 tuple-type 或 JSON 或类似的类型) ,并且您将提取一个字段作为键。

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

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

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

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

另一个有趣的用例

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

我仍然要弄清楚这是否可行。将继续更新我的答案与进一步的细节。