资讯专栏INFORMATION COLUMN

基于权重的随机负载均衡路由算法

dailybird / 2545人阅读

摘要:样例实现一实现二总个数总权重权重是否都一样累计总权重计算所有权重是否一样如果权重不相同且权重大于则按总权重数随机并确定随机值落在哪个片断上如果权重相同或权重为则均等随机想获取最新内容,请关注微信公众号

样例
private Map serverMap = new HashMap(){{
        put("192.168.1.100",1);
        put("192.168.1.101",1);
        put("192.168.1.102",4);
        put("192.168.1.103",1);
        put("192.168.1.104",1);
        put("192.168.1.105",3);
        put("192.168.1.106",1);
        put("192.168.1.107",2);
        put("192.168.1.108",1);
        put("192.168.1.109",1);
        put("192.168.1.110",1);
    }};

    private List servers = new ArrayList<>(serverMap.keySet());
实现一
public void weightRandom(){
        Set keySet = serverMap.keySet();
        List servers = new ArrayList();
        for(Iterator it = keySet.iterator();it.hasNext();){
            String server = it.next();
            int weight = serverMap.get(server);
            for(int i=0;i
实现二
public String randomWeight(){
        int length = serverMap.size(); // 总个数
        int totalWeight = 0; // 总权重
        boolean sameWeight = true; // 权重是否都一样
        for (int i = 0; i < length; i++) {
            int weight = serverMap.get(servers.get(i));
            totalWeight += weight; // 累计总权重
            if (sameWeight && i > 0
                    && weight != serverMap.get(servers.get(i-1))) {
                sameWeight = false; // 计算所有权重是否一样
            }
        }
        if (totalWeight > 0 && ! sameWeight) {
            // 如果权重不相同且权重大于0则按总权重数随机
            int offset = ThreadLocalRandom.current().nextInt(totalWeight);
            // 并确定随机值落在哪个片断上
            for (int i = 0; i < length; i++) {
                offset -= serverMap.get(servers.get(i));
                if (offset < 0) {
                    return servers.get(i);
                }
            }
        }
        // 如果权重相同或权重为0则均等随机
        return servers.get(ThreadLocalRandom.current().nextInt(length));
    }
doc

dubbo-RandomLoadBalance

想获取最新内容,请关注微信公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67135.html

相关文章

  • dubbo服务集群扩展、目录服务、路由规则、负载均衡

    摘要:集群扩展当有多个服务提供方时,将多个服务提供方组织成一个集群,并伪装成一个提供方。目录服务的头部注释中,引用做了一个介绍。路由规则负责从多个中按路由规则选出子集,比如按照读写分离应用隔离等。若处理完毕则计数器减。 1. Cluster-集群扩展 当有多个服务提供方时,将多个服务提供方组织成一个集群,并伪装成一个提供方。已知的实现如下, 1-1. FailoverCluster(默认的)...

    shery 评论0 收藏0
  • Dubbo 源码分析 - 集群容错之 LoadBalance

    摘要:即服务提供者目前正在处理的请求数一个请求对应一条连接最少,表明该服务提供者效率高,单位时间内可处理更多的请求。此时应优先将请求分配给该服务提供者。初始情况下,所有服务提供者活跃数均为。 1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载均摊到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务...

    ybak 评论0 收藏0
  • 一篇读懂分布式架构下负载均衡

    摘要:一篇读懂分布式架构下的负载均衡微信公众号一刻钟大型现实非严肃主义现场一刻钟与你分享优质技术架构与见闻,做一个有剧情的程序员关注可第一时间了解更多精彩内容,定期有福利相送哟。 一篇读懂分布式架构下的负载均衡 微信公众号:IT一刻钟大型现实非严肃主义现场一刻钟与你分享优质技术架构与见闻,做一个有剧情的程序员关注可第一时间了解更多精彩内容,定期有福利相送哟。 showImg(https:/...

    LuDongWei 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<