Apache Camel中的partition_key与key的区别



我使用的是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_KEYKafkaConstants.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

您需要指定一个键才能使用您在骆驼路由中指定的分区键。

最新更新