XXL-Job路由策略---一致性hash算法

前提

路由策略有很多,轮询,随机,一致性hash,今天我们要分析的是是一致性hash,那么它有什么好处呢?

好处

  • 可扩展
  • 很好的容错性

缺点

  • 数据倾斜问题: 可用虚拟节点解决

实现逻辑

  1. 将地址列表中每一个地址进行hash计算,存到TreeMap中,TreeMap会根据key进行排序,(key为hash,value为地址)
  2. 将jobId进行hash计算,得到hash值,然后在TreeMap中找到hash值最相近的hash值,得到对应的value,这个value就是我们请求要发送的地址。
  3. 当我们要扩容一个机器,那么TreeMap中就会多存一个数据,这个数据就是新扩容的机器地址,我们所说的一致性,并不是说新增之后所有的数据都能够正常访问,只是相对来说,节点越多,失效的数据越少,因为我们找节点(服务器ip地址)是按照范围来找的
    在这里插入图片描述
    在这里插入图片描述

代码

VIRTUAL_NODE_NUM 为虚拟节点号,可增加虚拟节点

 private static int VIRTUAL_NODE_NUM = 5;
 
 public String hashJob(int jobId, List<String> addressList) {

        TreeMap<Long, String> addressRing = new TreeMap<Long, String>();
        for (String address: addressList) {
            for (int i = 0; i < VIRTUAL_NODE_NUM; i++) {
                long addressHash = hash("SHARD-" + address + "-NODE-" + i);
                addressRing.put(addressHash, address);
            }
        }

        long jobHash = hash(String.valueOf(jobId));
     	// 取到》=jobHash的hash值,该方法调用返回此映射,其键大于或等于fromKey的部分视图
        SortedMap<Long, String> lastRing = addressRing.tailMap(jobHash);
        if (!lastRing.isEmpty()) {
            // 取到第一位的hash值
            return lastRing.get(lastRing.firstKey());
        }
        return addressRing.firstEntry().getValue();
    }

在这里插入图片描述
每次取得lastRing的第一个数据,作为我们分发请求地址

总结

可扩展:

如果我们新增和减少服务,对于已有的服务只需要重定位环空间中的一小部分数据即可

容错性

如服务器做缓存,服务器数量发生改变时,并不是所有都会失效,而只有部分缓存失效,前端的缓存仍然能分担整个系统的压力,而不至于所有压力都在同一个时间集中到后端服务器上。

如何解决数据倾斜

可增加虚拟节点,一个实际节点可以对应多个虚拟节点,如下图,30,20,50分别为3个地址,经过增加虚拟节点之后,可以增加为15个节点,虚拟节点越多,hash环上的节点就越多,缓存/请求均匀分布的概率就越大

在这里插入图片描述

解决了什么问题

均匀分布请求,并在服务器数量变化时,还能有很好的扩展性和容错性,解决了hash算法的由于服务器数量变化,引起所有缓存的失效,因为hash算法用到了取余,是固定的值,当服务器数量变化,那么就有可能取余的值都不一样,那么也就访问不到原来的服务器了,即所有缓存失效,如用一致性hash,那么值就变成了范围,而不是具体的值,那么这样就会大大减少缓存失效的影响

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值