Kafka | producers的所有examples都显示ProducerRecord
的键/值对不仅具有相同的类型(所有示例都显示为<String,String>
),而且具有相同的值。例如:
producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));
但在Kafka文档中,我似乎找不到在哪里解释了键/值的概念(以及它的基本用途/工具)。在传统的消息传递(ActiveMQ、RabbitMQ等)中我总是在特定的主题/队列/交换上触发一条消息。但Kafka是第一个似乎需要键/值对而不仅仅是常规字符串消息的代理。
所以我问:要求生产商发送KV对的目的/用处是什么?
发布于 2016-11-30 04:53:12
Kafka使用由分区组成的分布式日志的抽象。将日志拆分为多个分区可以向外扩展系统。
键用于确定消息附加到的日志中的分区。而该值是消息的实际有效载荷。在这方面,示例实际上并不是很“好”;通常,您会将复杂类型作为值(如元组类型或JSON或类似类型),并提取一个字段作为键。
请参阅:http://kafka.apache.org/intro#intro_topics和http://kafka.apache.org/intro#intro_producers
通常,键和/或值也可以是null
。如果密钥为null
,则会选择一个随机分区。如果该值为null
,则它可以具有特殊的"delete“语义,以防您为某个主题(http://kafka.apache.org/documentation#compaction)启用日志压缩而不是日志保留策略。
发布于 2019-10-18 20:01:56
后期添加..。如果在一个主题的消费者组中有多个消费者,则指定键,以便同一键上的所有消息都转到相同的分区,对于正确的消息处理顺序非常重要。
如果没有键,同一键上的两个消息可能会去往不同的分区,并被组中的不同使用者无序地处理。
发布于 2020-01-29 11:39:21
另一个有趣的用例
我们可以使用Kafka主题中的键属性来发送user_ids,然后可以插入一个消费者来获取流事件(存储在值属性中的事件)。这可以允许您处理任何用户事件序列的最大历史记录,以便在您的机器学习模型中创建特征。
我还得找出这是不是可能。我会不断更新我的答案,并提供更多详细信息。
https://stackoverflow.com/questions/40872520
复制相似问题