[原创]解决Spring Boot Kafka 分区不均匀问题
现象
我们通常使用多个分区,开多线程来提高Kafka的消费速度,分区不均匀会导致线程闲置,消费速度过慢,进而导致消息积压
。
问题原因
消息写入哪个分区是由生产者
决定的,在调用kafkaTemplate.send()
方法时,可以指定分区,否则使用默认分区器DefaultPartitioner
计算。因为分区可能会调整,通常我们不会指定固定分区,而是依靠分区计算器。
查看DefaultPartitioner
代码可以得知:当指定了key
每次都会计算出固定的分区,否则会自动计算出一个可用分区。
Kafka指定key计算出固定分区是为了满足消息有序的需求,如果你需要保证消息的有序性而指定了key,本文描述的方法可能不适用你。
解决方案
那么解决这个问题的方式就是:
- 不再指定key
- 自定义分区器,每次计算出不同的分区
方法1不可行,因为这需要调整业务,成本太高,且合理的使用key有助于业务更清晰。