如何在Kafka消费者可以被分配到一个特定的分区;在我的例子中,分区是通过密钥的散列值分配的

ldioqlga  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(469)

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

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”的散列键生成的分区中消费。我是否再次计算消费者中该键的哈希值,或者是否有其他方法来实现这一点。我对这项技术很陌生。

4sup72z8

4sup72z81#

基于您是kafka新手的信息,我很想猜测您无意中尝试了一个高级用例,而这可能不是您想要的。
常见的用例是将消息发布到主题。消息将根据 key 同一密钥的所有消息都在同一分区结束。
在使用者上,您订阅整个主题(没有明确要求分区),kafka将处理所有可用使用者之间的分区分布。
这就保证了所有具有特定密钥的消息都将由同一个使用者处理(它们都进入同一个分区,每个分区只有一个使用者处理),并且它们的发送顺序相同。
如果您真的想自己选择分区,可以编写一个分区器类,并通过设置 partitioner.class 配置。
从Kafka文献中

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

一些关于如何做到这一点的示例教程可以在网上找到。以下是供参考的示例:
编写一个apachekafka自定义分区器
ApacheKafka基金会课程-自定义分区

相关问题