差异partition_key vs Apache Camel中的密钥

时间:2017-11-08 15:50:10

标签: apache-camel apache-kafka

我正在使用camel-kafka版本2.19.2,我在Camels网站上发布了文档 - camel-kafka,然后在此处发布此问题。

我看到有以下示例用于生成消息。

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

另外,对于这些信息,我有一个带有4个分区的kafka主题。

我和他们两个玩了,我明白KafkaConstants.KEY充当消息密钥,这个密钥将用于确定消息所在的分区。

KafkaConstants.PARTITION_KEY是我在尝试设置分区号时感到困惑的,但它仍然将消息发送到所有4个分区。

任何人都可以指定这两个KafkaConstants之间的区别吗?具体是KafkaConstants.PARTITION_KEY用于什么?

编辑:更正了正在使用的骆驼版本。

1 个答案:

答案 0 :(得分:1)

来自2.21.0-SNAPSHOT docs的github doc:

KEY: 记录键(如果未指定键,则为null)。如果已配置此选项,则它优先于标题链接KafkaConstants.KEY

PARTITION_KEY: 要将记录发送到的分区(如果未指定分区,则为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

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