[英]How to make a partition of a topic in Kafka by user_id?
我正在使用 SpringBoot 构建 Web 应用程序后端,并且必须使用 Kafka 来发送消息。 我想要一个主题,例如“testTopic”,我想在那里产生一些来自不同用户的消息,以便稍后将消息发送到不同的机器。
如果用户 A 向他的机器发送一条消息,而用户 B 向他的机器发送一条消息。 如何区分谁发送了哪条消息以及它应该到达哪台机器?
我已经阅读了有关 Kafka 主题分区的信息,但我不知道我是否在我的代码中做得很好。
在这里,我正在构建我的主题
@Bean
public NewTopic kafkaExampleTopic() {
return TopicBuilder.name("TestTopic").partitions(1).build();
}
在这里,我正在向该主题发送数据
@Bean
CommandLineRunner commandLineRunner(KafkaTemplate<String, String> kafkaTemplate) {
return args -> {
kafkaTemplate.send("TestTopic", String.valueOf(MessageBuilder.withPayload("Hello kafka testTopic uno con key 1")
.setHeader(KafkaHeaders.MESSAGE_KEY, "1").build()));
kafkaTemplate.send("TestTopic", String.valueOf(MessageBuilder.withPayload("Hello kafka testTopic uno con key 2")
.setHeader(KafkaHeaders.MESSAGE_KEY, "2").build()));
};
}
这是我的听众
@KafkaListener(topics = "TestTopic", groupId = "exampleGroupId")
public void listenWithHeaders(
@Payload String message,
@Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) {
System.out.println(
"Received Message: " + message
+ "from partition: " + partition);
}
十分感谢大家!
主题分区需要提前确定。
例如,如果您有数字 id,您可以定义一个包含十个分区的主题,然后创建您自己的 Partitioner 类,该类将根据其前导数字将每个数字路由到分区中(id 1、10、15 等都进入分区1)。 如果您使用十六进制值(例如 UUID),则可能是具有 16 个分区(af,0-9)的主题。 字母数字小写 - 36,依此类推。
默认情况下,Kafka 的 DefaultPartitioner 将按照主题分区的数量执行 Murmur2 哈希模 d。 这样,例如 ids 5 和 7 可能最终会出现在同一个分区中。 根据您消费者的需求,这可能不是您想要的。
消费者是在不同机器上运行的东西。 除了知道不能为同一组的消费者分配相同的分区外,分区应该无关紧要(如果您只有一个分区,则每个组只有一个消费者可以读取它)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.