为什么Kafka要分区
在了解分区策略之前,我们有必要先了解一下为什么要分区。其实分区的作用就是提供负载均衡的能力或者说对数据进行分区的主要原因就是为了实现系统的高伸缩性。不同的分区能够被放到不同的节点机器上,而数据的读写操作也是针对分区这个粒度进行的,使用分区之后每个节点的机器都能独立地执行各自分区的读写请求处理并且,我们还能通过添加新的节点机器来增加系统整体的吞吐量。
从上图,我们不难发现,分区是属于主题的,消息是属于分区的。
Kafka有哪些常见的分区策略
分区策略是决定生产者将消息发送到哪一个分区的算法。Kafka不仅仅提供了默认的分区策略,同时它也支持你自定义分区策略。
如果自定义分区策略,则需要对生产者端的参数进行配置。在这里不会对配置方法进行详细说明。
轮询策略
轮询策略也称Round-robin策略,即顺序分配。比如一个主题下有2个分区,那第一条消息会发送到分区0,第二条被发到分区1,第三条被发送到分区0,以此类推。如下图所示。
轮询策略是Kafka Java生产者API默认提供的分区策略。如果没有指定分区策略,则会默认使用轮询。
轮询策略有着非常优秀的负载均衡表现,它总是能保证消息最大限度平均分配到所有分区上,所以一般情况下它是最合理的分区策略,也是我们常用的分区策略之一。
随机策略
随机策略就是我们随机的将消息放到任意一个分区上,如下图所示。
本质上,随机策略也是力求将数据均匀地打散到各个分区,但是从实际表现来看,它要逊于轮询策略,所以如果追求数据的均匀分布,轮询策略比随机策略优秀。
Key-ordering策略
Kafka允许为每条消息定义key。这个key可以是一个有着明确业务含义的字符串,也可以用来表征消息元数据。一旦消息被定义了Key,那就可以保证同一个Key的所有消息都被发送到相同的分区中。对于一些需求是严格要求执行顺序的,可以采用这种方法进行发送消息。这样就能保证消息有序(消费同一个分组中的数据是有序的)
Kafka默认的分区策略实际上有两种,在没有指定key的情况下,使用轮询。如果指定了Key,则默认按照key-ordering策略
总结
分区是实现负载均衡和高吞吐的关键,所以在生产者端一定要使用适合业务的分区策略,避免造成消息数据的“倾斜”,使某些分区成为性能瓶颈。
常见的分区策略有:
- 轮询:在不指定key的情况下默认的分区策略,能够最大限度实现数据均匀发送到每一个分区
- 随机:本质也是想要实现数据均匀发送
- key-ording:在指定key时默认的分区策略,能够在某些严格要求执行顺序的业务上发挥Kafka的多分区带来的性能提升