如何在Kafka中将消费者分配到特定分区;在我的情况下,该分区是通过Key的哈希值分配的

时间:2018-08-31 16:33:29

标签: apache-kafka

当生产者使用数字分配分区时。例如

kafkaTemplate.send(topic, 1, "[" + LocalDateTime.now() + "]" + "Message to partition 1");

第二个数字 1 定义我希望将邮件发送到的分区ID。因此,消费者可以使用此消息:

 TopicPartition partition1 = new TopicPartition(topic, 1);
 consumer1.assign(Arrays.asList(partition1));

但是对于生产者如何使用DefaultPartitioner基于生产者发送的键的哈希值选择分区,我该如何实现呢?示例:

kafkaTemplate.send(topic, "forpartition1", "testkey");

这里的密钥是“ forpartition1” ,我该如何分配我的使用者以从“ forpartition1” 的哈希密钥生成的分区中消费。我是否要再次在使用者中计算该键的哈希值,或者是否有其他方法可以实现该目的。我对这项技术还很陌生。

1 个答案:

答案 0 :(得分:1)

基于您刚接触Kafka的信息,我很容易猜测您是无意中尝试了一个高级用例,而这可能并不是您想要的。

常见用例是您将消息发布到某个主题。将根据key为邮件分配一个分区,并且同一键的所有邮件都在同一分区结束。

在使用者上,您订阅了整个主题(没有明确要求分区),Kafka将处理所有可用使用者之间的分区分配。

这可以确保所有具有特定密钥的消息都将由相同的使用者处理(它们都进入相同的分区,并且只有一个使用者处理每个分区)并且发送的顺序相同。

如果您真的想自己选择分区,则可以编写一个分区器类,并通过设置partitioner.class配置将生产者配置为使用它。

Kafka Documentation

NAME
partitioner.class

DESCRIPTION
Partitioner class that implements the org.apache.kafka.clients.producer.Partitioner interface.

TYPE
class

DEFAULT
org.apache.kafka.clients.producer.internals.DefaultPartitioner

VALID VALUES

IMPORTANCE
medium

可以在网上找到一些有关如何执行此操作的示例教程。以下是供参考的示例: