关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。
11个月前关门了。
改进这个问题
所有Kafka制作人的例子都显示了 ProducerRecord
的键/值对不仅是同一类型(所有示例都显示 <String,String>
),但值相同。例如:
producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));
但在Kafka的文档中,我似乎找不到关键/价值概念(及其潜在的目的/效用)的解释。在传统的消息传递(activemq、rabbitmq等)中,我总是在特定的主题/队列/交换上触发消息。但是kafka是第一个似乎需要键/值对而不仅仅是常规的ole字符串消息的代理。
所以我问:要求生产商发送kv对的目的/用途是什么?
3条答案
按热度按时间hc2pp10m1#
kafka使用由分区组成的分布式日志的抽象。将日志拆分为分区可以扩展系统。
键用于确定日志中附加了消息get的分区。而该值是消息的实际有效负载。这些例子在这方面其实不是很“好”;通常,您会将一个复杂类型作为值(比如元组类型或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).fzwojiic2#
延迟添加。。。如果在一个主题的使用者组中有多个使用者,那么指定密钥以便同一密钥上的所有消息都转到同一分区对于正确排序消息处理非常重要。
如果没有密钥,同一密钥上的两条消息可能会转到不同的分区,并由组中的不同使用者无序处理。
6tdlim6h3#
另一个有趣的用例
我们可以使用kafka主题中的key属性来发送用户id,然后可以插入一个消费者来获取流事件(存储在value属性中的事件)。这可以允许您处理用户事件序列的任何最大历史记录,以便在机器学习模型中创建功能。
我还得弄清楚这是否可行。我会不断更新我的答案和进一步的细节。