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

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

一、kafka为什么不使用多个主题而是使用一个主题下多个分区了?

1:kafka的分区的作用就是负载均衡对数据的分区可以实现系统的高伸缩性。不同分区的数据放在不同的机器节点上,因为kafka的副本机制是在分区层面的。数据的读写操作都是在分区的粒度上进行的。这样每个节点都可以独立的处理对应自己分区的数据,也可以通过增加节点来提高kafka系统的吞吐量。

2、kafka的分区策略
注释:分区策略决定生产者将数据发送到对应主题的哪个分区的计算逻辑

A:轮询策略
即为顺序分配策略。例如一个主题下有三个分区,那么第一条消息发送到第一个分区,第二条消息就发送到第二个分区,第三条消息发送到第三个分区,然后后面的一次轮询。如下图
在这里插入图片描述
kafka的默认分区策略就是轮询策略,
优点
该策略有着非常好的负载均衡表现,能保证消息最大限度的均匀的分布在所有的分区上,也是我们最常用的分区策略

B:随机策略
就是随机的讲消息放到对应的分区上。虽然看上去是将消息随机的分发到了对应的节点的分区中,但是实际没有轮询策略分布的那么均匀。如下图
在这里插入图片描述
想要实现随机策略,可以直接使用如下代码:
首先计算出对应主题有多少个分区,然后随机返回小于这个分区数的一个整数

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

C:key-ordering 策略

kafka可以自定义消息键,形成k-v的数据格式,这个key可以是业务主键,也可以将消息创建的时间戳直接封装到key中,针对自己封装的key,可以自定的将同一个key的消息写入到同一分区中,每个分区的消息是有序的,所以也可以称为:按照消息键排序策略,

List<PartitionInfo> parts = cluster.partitionsForTopic(topic);
return Math,abs(key.hashcode()) % parts.size();

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值