接上一篇博文:负载均衡算法–轮询法(Round Robin),本文讲解加权轮询算法。

加权轮询算法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请求;给配置低、负载高的机器分配较低的权重,降低系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

算法描述

假设有 N 台服务器 S = {S0, S1, S2, …, Sn},默认权重为 W = {W0, W1, W2, …, Wn},服务器列表为 serverList,算法可以描述为:
1、初始化 serverList,将 W0 个 S0 加入至serverList,将 W1 个 S1 加入至serverList,依据此规则将所有的服务器加入至 serverList 中;
2、从 serverList 的从 S0 开始依序调度;
3、若所有服务器都已被调度过,则从头开始调度;

假定我们现在有如下四台服务器:

服务器地址 权重
192.168.1.1 1
192.168.1.2 2
192.168.1.3 3
192.168.1.4 4

初始化服务列表后, serverList 如下:

服务器地址 序号
192.168.1.1 1
192.168.1.2 2
192.168.1.2 3
192.168.1.3 4
192.168.1.3 5
192.168.1.3 6
192.168.1.4 7
192.168.1.4 8
192.168.1.4 9
192.168.1.4 10

加权轮训算法通过在服务器列表中增加相应的权重个数的服务器来达到加权的效果,每个服务器会依序被轮训到。

代码实现

1、服务器管理类

package org.learn.loadbalance;import java.util.Map;
import java.util.TreeMap;/*** @author zhibo* @date 2019/5/16 16:25*/
public class ServerManager {public volatile static Map<String, Integer> serverMap = new TreeMap<>();static {serverMap.put("192.168.1.1", 1);serverMap.put("192.168.1.2", 2);serverMap.put("192.168.1.3", 3);serverMap.put("192.168.1.4", 4);}
}

2、加权轮询类

package org.learn.loadbalance;import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;/*** @author zhibo* @date 2019/5/16 16:28*/
public class WeightRoundRobin {private static AtomicInteger indexAtomic = new AtomicInteger(0);public static String getServer() {ArrayList<String> serverList = new ArrayList<>();Set<String> serverSet = ServerManager.serverMap.keySet();Iterator<String> iterator = serverSet.iterator();while(iterator.hasNext()){String server = iterator.next();Integer weight = ServerManager.serverMap.get(server);for (int i = 0; i < weight; i++) {serverList.add(server);}}if (indexAtomic.get() >= serverList.size()) {indexAtomic.set(0);}String server = serverList.get(indexAtomic.getAndIncrement());return server;}public static void main(String[] args) {for (int i = 0; i < 20; i++) {String server = getServer();System.out.println(server);}}
}

1、使用 AtomicInteger 进行轮询索引的增减,保证并发的安全性。
2、在多线程的情况下, 线程A修改 ServerManager.serverMap 的值,线程B无法即时拿到线程A修改后的值,因此可能会产生请求错误,需要调用端进行容错处理。
3、从宏观的角度讲,权重高的服务器被访问的次数高一些,近似均衡;微观的角度讲,权重高的服务器会被连续访问到,看起来没有那么均衡。

执行 main 方法输出结果如下:

文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

负载均衡算法--加权轮询法(Weight Round Robin)相关推荐

  1. 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析

    本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...

  2. 负载均衡算法--轮询法(Round Robin)

    在分布式系统中,为了实现系统的高性能.高并发.高可用,在构架中都会进行负载均衡设计,它是分布式系统的核心和中枢,负载均衡的好坏直接影响着整个系统的性能.负载均衡分为软件均衡和硬件均衡两类,比如apac ...

  3. 负载均衡之加权轮询算法

    在介绍加权轮询算法(WeightedRound-Robin)之前,首先介绍一下轮询算法(Round-Robin). 一:轮询算法(Round-Robin) 轮询算法是最简单的一种负载均衡算法.它的原理 ...

  4. nginx负载均衡之加权轮询

    当nginx作为代理服务器时,需要将客户端的请求转发给后端服务器进行处理,如果后端服务器有多台,那如何选择合适的后端服务器来处理当前请求,也就是本篇文章要介绍的内容.nginx尽可能的把请求分摊到各个 ...

  5. 负载均衡算法-权重轮询均衡

    ②权重轮询均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求.

  6. 负载策略_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  7. js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  8. 负载均衡与DNS轮询

    负载均衡 load balance 负载均衡(Load Balancing)是一种将工作负载(Workload)分摊到多个计算资源(服务器.存储设备.网络设备等)上的技术,目的是提高系统的可用性.性能 ...

  9. Nginx负载均衡策略之轮询与加权轮询

    轮询 是upstream模块负载均衡默认的策略.每个请求会按时间顺序逐个分配到不同的后端服务器.轮询不需要额外的配置. upstream backend{server 192.168.200.146: ...

最新文章

  1. 4 app版本号 swift_已开源 app 实现检查更新的简单方式
  2. VTK:KDTree时序用法实战
  3. rocketmq 消息 自定义_跟我学RocketMQ[1-4]之消息消费及支持spring
  4. 宿松县事业单位计算机基础知识,计算机基础知识试题(事业单位考试)
  5. 培训班出身的程序员怎么了
  6. java 抽象类的匿名类_Java匿名内部类(通过继承抽象类来实现)
  7. android q桌面,Android Q带来全新桌面模式
  8. python random 之基础点名器
  9. python对工程造价有用吗_工程造价真的不行了吗?
  10. JAVA 分布式 - 分布式介绍
  11. hazy的leetcode刷题笔记(一)
  12. APP支付支付签名验证失败
  13. 自学编程的好方法,直接省了几万块钱报班,不收藏就可惜了
  14. 云栖大会圆满落幕,极客天成精彩现身
  15. 云豹智能发布全功能云霄DPU网卡,引领数据中心新趋势
  16. 游戏引擎与游戏开发入门介绍
  17. 一次线上游戏卡死的解决历程
  18. 日本高铁想到的网络安全
  19. Lucene随笔-Lucene的索引文件格式
  20. 电机不动 米兔机器人_【小米 米兔机器人使用总结】拼装|底座|背面|电机|机枪_摘要频道_什么值得买...

热门文章

  1. 上海美女和德国富商行骗富豪圈 3年净赚3亿
  2. c++ 右移运算符重载 << 参数个数
  3. R语言使用plot函数可视化数据散点图,使用font参数指定字体类型为斜体字体(italics)
  4. 计算机组成原理中机器字长与存储字长的定义,与区别
  5. my thinking
  6. animator android,Android动画Animator开发问题
  7. HTML代码制作html5图标
  8. 实现阮一峰ES6的顶部加载条效果
  9. 纽市盘前:美指紧咬98关口,“逆向选美”优势明显;供给过度收紧,油价勿轻易看衰
  10. 高德地图实现区域下钻