分区策略
构造KafkaProducer代码如下:
属性partitioner.class就是决定消息如何分区的,默认实现类是DefaultPartitioner,源码注释如下:
源码分析
在调用send()方法发送消息时,会调用如下代码选择分区:
partition()方法源码如下:
DefaultPartitioner即默认分区选取策略的源码如下:
通过设置相同key来保证消息有序性,这里可能还会有一点小小的缺陷。例如消息发送设置了重试机制,并且异步发送,消息A和B设置相同的key,业务上A先发,B后发。由于网络或者其他原因A发送失败,B发送成功;A由于发送失败就会重试且重试成功,这时候消息顺序B在前A在后,与业务发送顺序不一致。如果需要解决这个问题,需要设置参数,其含义是限制客户端在单个连接上能够发送的未响应请求的个数。设置此值是1表示kafka broker在响应请求之前client不能再向同一个broker发送请求,这个参数默认值是5。官方文档说明如下,这个参数如果大于1,由于重试消息顺序可能重排:
自定义
KafkaCustomPartitioner就是自定义实现类,假定分区策略如下:
分区实现的核心源码如下:
领取专属 10元无门槛券
私享最新 技术干货