首页 > 解决方案 > kafka producer 中两种不同类型的分区

问题描述

在 Kafka 生产者中,我发送两组不同的数据。我有两个主题分区。第一个有钥匙,第二个没有钥匙。据我所知,密钥用于为数据创建分区。如果 key 不存在,将发送 null 并且分区将通过循环调度发生。

但问题是,如果我在某个特定时间段内交替发送带密钥和不带密钥的数据,会发生什么?

除了使用 key 创建的分区之外的分区是否会发生循环调度,还是会发生在所有两个分区上?

标签: apache-kafka

解决方案


Kafka 根据以下规则选择分区

  1. 如果使用自定义分区器,则分区器将根据自定义分区器逻辑进行选择。
  2. 如果没有自定义分区器,那么 Kafka 使用 DefaultPartitioner

一个。如果键为空,则在循环中选择分区。

湾。如果键是非空键,那么它使用 Murmur2 散列和模来识别主题的分区。

因此,带有键(空或非空)的消息将使用默认分区器在两个分区上发布,而没有定义自定义分区器。

要在特定分区中实现消息发布,您可以使用以下方法。

  1. 发布消息时显式传递分区

    /** * 创建一条记录发送到指定的topic和partition */ public ProducerRecord(String topic, Integer partition, K key, V value) { this(topic, partition, null, key, value, null); }

  2. 您可以创建自定义分区并实现逻辑来选择分区

https://kafka.apache.org/10/javadoc/org/apache/kafka/clients/producer/Partitioner.html


推荐阅读