partition:分区
主题会由多个分区组成,通常每个分区的消息都是按照顺序读取的,不同的分区无法保证顺序性
分区也就是我们常说的数据分片sharding机制,主要目的就是为了提高系统的伸缩能力
通过分区,消息的读写可以负载均衡到多个不同的节点上
发送消息时如何选择分区的?
主要有两种方式:
1 轮询,按照顺序消息依次发送到不同的分区
2 随机,随机发送到某个分区
如果消息指定key,那么会根据消息的key进行hash,然后对partition分区数量取模,决定落在哪个分区上
所以,对于相同key的消息来说,总是会发送到同一个分区上,也是我们常说的消息分区有序性。
很常见的场景就是我们希望下单、支付消息有顺序,这样以订单ID作为key发送消息就达到了分区有序性的目的。
如果没有指定key,会执行默认的轮询负载均衡策略,比如第一条消息落在P0,第二条消息落在P1,然后第三条又在P1。
除此之外,对于一些特定的业务场景和需求,还可以通过实现Partitioner
接口,重写configure
和partition
方法来达到自定义分区的效果。