kafka是如何将数据均匀分布到所有服务器上

kafka是如何将数据均匀分布到所有服务器上 一、kafka为什么不使用多个主题而是使用一个主题下多个分区了?
【kafka是如何将数据均匀分布到所有服务器上】1:kafka的分区的作用就是负载均衡,对数据的分区可以实现系统的高伸缩性。不同分区的数据放在不同的机器节点上,因为kafka的副本机制是在分区层面的。数据的读写操作都是在分区的粒度上进行的。这样每个节点都可以独立的处理对应自己分区的数据,也可以通过增加节点来提高kafka系统的吞吐量。
2、kafka的分区策略。
注释:分区策略决定生产者将数据发送到对应主题的哪个分区的计算逻辑
A:轮询策略
即为顺序分配策略。例如一个主题下有三个分区,那么第一条消息发送到第一个分区,第二条消息就发送到第二个分区,第三条消息发送到第三个分区,然后后面的一次轮询。如下图
kafka是如何将数据均匀分布到所有服务器上
文章图片

kafka的默认分区策略就是轮询策略,
优点:
该策略有着非常好的负载均衡表现,能保证消息最大限度的均匀的分布在所有的分区上,也是我们最常用的分区策略。
B:随机策略
就是随机的讲消息放到对应的分区上。虽然看上去是将消息随机的分发到了对应的节点的分区中,但是实际没有轮询策略分布的那么均匀。如下图
kafka是如何将数据均匀分布到所有服务器上
文章图片

想要实现随机策略,可以直接使用如下代码:
首先计算出对应主题有多少个分区,然后随机返回小于这个分区数的一个整数

List parts = cluster.partitionsForTopic(topic); return ThreadLocalRandom.current,nextInt(parts.size());

C:key-ordering 策略
kafka可以自定义消息键,形成k-v的数据格式,这个key可以是业务主键,也可以将消息创建的时间戳直接封装到key中,针对自己封装的key,可以自定的将同一个key的消息写入到同一分区中,每个分区的消息是有序的,所以也可以称为:按照消息键排序策略,
List parts = cluster.partitionsForTopic(topic); return Math,abs(key.hashcode()) % parts.size();

备注:
根据kafka的默认的分区策略,同一个key的消息肯定会发送到同一分区。如果想保证消息顺序,指定消息key即可,同一个分区的消息是有顺序的。

    推荐阅读