examples |的所有Kafka producers显示ProducerRecord
的键/值对不仅是同一类型(所有示例都显示<String,String>
),而是相同的值 。例如:
producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));
但是在Kafka文档中,我似乎无法找到解释键/值概念(及其基本目的/效用)的位置。在传统消息传递(ActiveMQ,RabbitMQ等)中,我总是在特定主题/队列/交换中发出消息。但Kafka是第一个似乎需要键/值对的代理,而不仅仅是一个规则的字符串消息。
所以我问:要求生产者发送KV对的目的/用途是什么?
答案 0 :(得分:49)
Kafka使用由分区组成的分布式日志的抽象。将日志拆分为分区可以扩展系统。
Keys 用于确定将消息附加到的日志中的分区。而值是消息的实际有效负载。在这方面,这些例子实际上并不是很“好”;通常你会有一个复杂的类型作为值(如元组类型或JSON或类似),你将提取一个字段作为键。
请参阅:http://kafka.apache.org/intro#intro_topics和http://kafka.apache.org/intro#intro_producers
通常,密钥和/或值也可以是null
。如果密钥是null
,则选择随机分区。如果值为null
,则 可以具有特殊的“删除”语义,以防您为主题(http://kafka.apache.org/documentation#compaction)启用日志压缩而不是日志保留策略。
答案 1 :(得分:5)
最新添加...如果要在某个主题的使用者组中有多个使用者,则指定键以使同一键上的所有消息都进入同一分区对于正确地进行消息处理非常重要。
没有密钥,同一密钥上的两条消息可能会转到不同的分区,并由该组中的不同使用者处理。
答案 2 :(得分:-1)
另一个有趣的用例
我们可以使用Kafka主题中的key属性发送user_id,然后可以插入使用者以获取流事件(事件存储在value属性中)。这可以让您处理用户事件序列的任何最大历史记录,以在机器学习模型中创建功能。
我仍然必须找出这是否可行。将继续更新我的答案,并提供更多详细信息。