当生产者使用数字分配分区时。例如
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” 的哈希密钥生成的分区中消费。我是否要再次在使用者中计算该键的哈希值,或者是否有其他方法可以实现该目的。我对这项技术还很陌生。
答案 0 :(得分:1)
基于您刚接触Kafka的信息,我很容易猜测您是无意中尝试了一个高级用例,而这可能并不是您想要的。
常见用例是您将消息发布到某个主题。将根据key
为邮件分配一个分区,并且同一键的所有邮件都在同一分区结束。
在使用者上,您订阅了整个主题(没有明确要求分区),Kafka将处理所有可用使用者之间的分区分配。
这可以确保所有具有特定密钥的消息都将由相同的使用者处理(它们都进入相同的分区,并且只有一个使用者处理每个分区)并且发送的顺序相同。
如果您真的想自己选择分区,则可以编写一个分区器类,并通过设置partitioner.class
配置将生产者配置为使用它。
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
可以在网上找到一些有关如何执行此操作的示例教程。以下是供参考的示例: