我使用的是camel-kafka 2.19.2版本,在这里发布这个问题之前,我浏览了Camels网站camel-kaf ka上的文档。
我看到存在以下用于生成消息的示例。
Producing messages:
from("direct:start").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody("Test Message from Camel Kafka Component Final",String.class);
exchange.getIn().setHeader(KafkaConstants.PARTITION_KEY, 0);
exchange.getIn().setHeader(KafkaConstants.KEY, "1");
}
}).to("kafka:localhost:9092?topic=test");
如您所见,存在KafkaConstants.PARTITION_KEY
和KafkaConstants.KEY
此外,作为参考,我有一个kafka主题,有4个分区。
我和他们两个一起玩过,我知道KafkaConstants.KEY
充当消息密钥,这个密钥将用于确定消息去往哪个分区
KafkaConstants.PARTITION_KEY
是我感到困惑的一个,因为它试图设置分区号,但它仍然向所有4个分区发送消息。
有人能说明这两个KafkaConstant之间的区别吗?KafkaConstants.PARTITION_KEY
的具体用途是什么?
编辑:更正了正在使用的驼色版本。
来自2.21.0-SNAPSHOT文档的github文档:
密钥:记录密钥(如果未指定密钥,则为null)。如果已配置此选项,则它优先于头链接KafkaConstants.KEY
分区键(_K):将记录发送到的分区(如果未指定分区,则为null)。如果已配置此选项,则它优先于标头链接KafkaConstants.PARTITION_KEY
来源:https://github.com/apache/camel/blob/master/components/camel-kafka/src/main/docs/kafka-component.adoc
完整性:
在卡夫卡:
- 数据实际上是一个键值对
- 它的存储发生在分区级别
密钥用于在集群内进行智能高效的数据分发。根据密钥的不同,Kafka将数据发送到特定的分区,并确保其也被复制(配置)。
正如您在Apache Camel项目的Camel Kafka主分支中所看到的:
https://github.com/apache/camel/blob/master/components/camel-kafka/src/main/java/org/apache/camel/component/kafka/KafkaProducer.java#L202-L215
您需要指定一个键才能使用您在骆驼路由中指定的分区键。