Kafka13-自定义分区器
1-走自定义分区器发送消息:走 partitionKafkaTemplate:带 key 按 key 的 hash 选分区,不带 key 随机选分区
2-代码仓库:https://gitee.com/enzoism/springboot-kafka-verify -b kafka-noauth

1-自定义分区器
- 先理解:【自定义分区器】-> 创建的 topic 也有不同的分区,我想按照 Key 分别存放到不同的分区里。
- 类比分析:有点类似Mysql的分库分表->想让数据按照指定规则分别存放到不同的地方去。
- 此时和序列化:没有关系,所以我只需要只需要在【生产】的时候指定【存放规则】即可
2-代码实操
-
1-还是KafkaTemplate<String, String>序列化工具
-
2-调用KafkaTemplate自带的方法->send(String topic, K key, @Nullable V data)进行存储
@Override
public ListenableFuture<SendResult<K, V>> send(String topic, K key, @Nullable V data) {
ProducerRecord<K, V> producerRecord = new ProducerRecord<>(topic, key, data);
return doSend(producerRecord);
}
- 3-业务代码示例
java
@Resource
private KafkaTemplate<String, String> partitionKafkaTemplate;
@Operation(summary = "走自定义分区器发送消息", description = "走 partitionKafkaTemplate:带 key 按 key 的 hash 选分区,不带 key 随机选分区")
@GetMapping("/message/save2")
public AjaxResult send2(@Parameter(description = "消息内容") @RequestParam String message,
@Parameter(description = "消息key(可选)") @RequestParam(required = false) String key) {
partitionKafkaTemplate.send(KafkaTopicConstants.TEST_TOPIC, key, message).addCallback(this::logSendSuccess,
ex -> log.error("消息发送失败 topic={}, message={}", KafkaTopicConstants.TEST_TOPIC, message, ex));
return AjaxResult.success("kafka发送消息成功");
}