如何将消息发送到 Kafka 中的特定分区?

Posted

技术标签:

【中文标题】如何将消息发送到 Kafka 中的特定分区?【英文标题】:How to send message to a particular partition in Kafka? 【发布时间】:2018-10-23 18:07:58 【问题描述】:

我创建了一个有很多分区的主题。使用控制台生产者我想将消息发送到特定分区并通过控制台消费者查看。 在控制台制作人我试过这个,

kafka-console-producer.bat --broker-list localhost:9092 --topic sample  --property parse.key=true --property key.separator=,

发送消息,

key1,another-message

但我只是对key1是否代表分区号感到困惑。

我使用控制台消费者查看了消息,

kafka-console-consumer.bat --zookeeper localhost:2181 --topic sample

我想根据分区查看消息。这是查看控制台消费者消息的正确方法吗?有人可以对此提供清楚的理解吗?

【问题讨论】:

请注意,如果您不是使用控制台生产者而是使用Kafka生产者客户端(如官方Java生产者客户端),您实际上可以直接指定消息应该的目标分区被送到。控制台生产者很适合玩,但通常不用于生产。 How to produce messages to selected partition using kafka-console-producer?的可能重复 【参考方案1】:

key不是分区号而是Kafka用key来指定目标分区。默认策略是根据 key 的 hash 选择分区,如果 key 为 null,则使用循环算法。

如果您需要自定义算法将消息映射到分区,您需要实现org.apache.kafka.clients.producer.Partitioner 接口。您的班级名称必须设置为生产者的partitioner.class 属性。

更新:也可以直接在ProducerRecord中指定分区号

【讨论】:

自定义分区可以通过编程来完成,其中一个例子可以在here找到。你不能用 kafka-console-producer 指定它 但是这个例子是Java代码,你Scala里有吗? 是的,用ProducerRecord(java.lang.String topic, java.lang.Integer partition, K key, V value) Creates a record to be sent to a specified topic and partition创建一个ProducerRecord 生产者使用密钥的哈希值将消息分发到分区。例如,您可以有两个分区,整数键和算法将偶数键分配到第一个分区,奇数键分配到第二个分区。至于分区号,当您将消息发送到 Kafka 时,您使用 ProducerRecord 对象。使用此对象,您可以明确指定分区号。 Kafka 中的键不是唯一的。因此,如果您有 3 条具有相同密钥的消息,则所有 3 条消息都将写入 Kafka。它们是否具有相同或不同的身体并不重要。如果你有基于 key 的分区算法,所有 3 条消息都会去同一个分区。

以上是关于如何将消息发送到 Kafka 中的特定分区?的主要内容,如果未能解决你的问题,请参考以下文章

Kafka - 消息排序保证

Kafka分区与消费者的关系

kafka如何保证顺序性

kafka3-核心概念

Kafka快速入门(生产者)同步异步发送分区消息精确一次发送幂等性事务

Kafka生成消息时的3种分区策略