当生产者使用一个数字分配分区时。例如
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条答案
按热度按时间4sup72z81#
基于您是kafka新手的信息,我很想猜测您无意中尝试了一个高级用例,而这可能不是您想要的。
常见的用例是将消息发布到主题。消息将根据
key
同一密钥的所有消息都在同一分区结束。在使用者上,您订阅整个主题(没有明确要求分区),kafka将处理所有可用使用者之间的分区分布。
这就保证了所有具有特定密钥的消息都将由同一个使用者处理(它们都进入同一个分区,每个分区只有一个使用者处理),并且它们的发送顺序相同。
如果您真的想自己选择分区,可以编写一个分区器类,并通过设置
partitioner.class
配置。从Kafka文献中
一些关于如何做到这一点的示例教程可以在网上找到。以下是供参考的示例:
编写一个apachekafka自定义分区器
ApacheKafka基金会课程-自定义分区