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

sme*_*eeb 59 messaging message-queue key-value messagebroker apache-kafka

所有的例子卡夫卡 | 生产者显示ProducerRecord的键/值对不仅是相同的类型(所有示例都显示<String,String>),而是相同的.例如:

producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));
Run Code Online (Sandbox Code Playgroud)

但是在Kafka文档中,我似乎无法找到解释键/值概念(及其基本目的/效用)的位置.在传统的消息传递(ActiveMQ,RabbitMQ等)中,我总是在特定的主题/队列/交换中发出消息.但Kafka是第一个似乎需要键/值对的代理,而不仅仅是一个正常的'字符串消息.

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

Mat*_*Sax 64

Kafka使用由分区组成的分布式日志的抽象.将日志拆分为分区允许横向扩展系统.

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

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

通常,键和/或值也可以是null.如果键是null随机分区将被选中.如果值为,null可以使用特殊的"删除"语义,以防您为主题启用日志压缩而不是日志保留策略(http://kafka.apache.org/documentation#compaction).

  • Keys***可用于确定分区,但它只是生产者的默认策略.最终,***生产者***选择使用哪个分区. (8认同)
  • 如果您指定了`partition` 参数,它将被使用,并且键将被“忽略”(当然,键仍将写入主题)。-- 即使您有密钥,这也允许您进行自定义分区。 (4认同)
  • 尤其值得注意的是,键在Kafka的流式API中也起着相关的作用,它带有`KStream`和`KTable`-参见[here](http://docs.confluent.io/current/streams/developer-guide.html# stream-developer-guide-dsl)。 (2认同)

小智 23

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

如果没有键,同一键上的两条消息可能会进入不同的分区,并被组中的不同消费者无序处理。