算法练习(20)-平滑加权轮询算法

一个很自然的想法:A-A-A-A-B ,按权重顺序依次分配,同时计数,每分配1次,计数减1,减到0后,再分配『次权重』的服务器。

看上去好象也凑合能用,但如果A:B的权重是100:1,A-A…-A-…(100次后),才分到B,B要坐很长时间的冷板凳,这显然不太好。

于是就有了个这个算法,它的思路如下:

初始状态时,配置的权重为:{A:80, B:20},然后给每个服务器,加1个动态的当前权重(curWeight),默认为0,按以下步骤:

1、curWeight += weight (注:weight为配置的权重)

2、挑选curWeight最大的,做为本次分配的结果,然后将curWeight -= sum(weight) ,即:分到的服务器,其动态权重- sum(配置权重)

3、开始下1次分配,分配前将每台服务器上的curWeight += weight(即:重复步骤1)

不断重复上述过程即可,下面分解下具体过程:

weight 初始状态:{80, 20},curWeight初始状态:{0,0}

次数 curWeight += weight max(curWeight) curWeight -= sum(weight) 1 {0,0}+{80,20} = {80,20} 80,即A {80 – 100 ,20} = {-20, 20} 2 {-20,20}+{80,20} ={60,40} 60,即A {60-100 ,40} = {-40, 40} 3 {-40, 40}+{80,20}={40,60} 60,即B {40, 60-100} = {40, -40} 4 {40, -40}+{80,20}={120,-20} 120,即A {120-100,-20} = {20, -20} 5 {20, -20}+{80,20}={100,0} 100,即A {100-100,0} = {0,0}

注:所有服务器curWeight归0时,这一轮分配就结束,

下次又回到原点,开始轮回

所以,最终分配的顺序就是 A – A – B – A – A,比原来的A – A – A – A – B ,是不是更为合理? 这个算法巧妙的地方在于,每一轮分配完成,所有服务器的动态权重都会归0,回到初始状态!另外1个优势在于,它能让所有权重的服务器,尽早分配到,而非等到高权重的服务器分配完,才轮到自己。

想想这其中的数学原理也不复杂,每次分到的服务器,其curWeight 减掉了 配置权重的总和sum(weight),然后下次分配前,又将配置权重加回来了,所以一减一加,正好抵消。

理解其中的原理后,用java代码来实现一把:

先定义一个服务器类:

然后开干:

输出:

A A B A A
A A B A A

最后扩展一下,这个算法不仅仅可用于负载均衡,很多业务系统也能用到,比如:在线客服系统,当有客人来咨询时,系统会从空闲的客服列表里,分配一个适合的客服来为其服务。因为客服的业务能力不同,能力强的客服可以配置更高权重,多分一些进线给他,反之新人就少分配一些,只要为客服的权重标签设置不同的值即可。

Original: https://www.cnblogs.com/yjmyzz/p/15916460.html
Author: 菩提树下的杨过
Title: 算法练习(20)-平滑加权轮询算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547815/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 什么是root帐户?

    root帐户就像一个系统管理员帐户,允许你完全控制系统。你可以在此处创建和维护用户帐户,为每个帐户分配不同的权限。每次安装Linux时都是默认帐户。 Java Program! O…

    技术杂谈 2023年5月31日
    082
  • 重载规则

    1、可重载的运算符 + – * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >&gt…

    技术杂谈 2023年7月11日
    066
  • C++处理系统相关权限问题

    权限问题处理是日常开发过程中很常见的一个操作,这里记录一下使用方法 1、给某个文件或文件夹赋予特定用户的特定访问权限 /* 给文件(夹)szPath设置用户名为pszAccount…

    技术杂谈 2023年7月10日
    079
  • 为什么每天都在学习,生活还是没有任何改善?

    作者:刘教练来源:刘教练(ID:liucoaching)在这个浮躁的时代,坚守自己的选择,专注地投入其中,你才会走得更远。■■■我有一个大学同学,只看他的朋友圈,你一定不知道他是做…

    技术杂谈 2023年6月1日
    089
  • 部署-centos安装docker

    docker简单介绍 docker是一门容器虚拟化的技术。它能够实现环境+软件一起打包的效果,因此它能避免因为环境不一样而导致的各种问题,大大的提高了软件的部署效率。而且在dock…

    技术杂谈 2023年7月23日
    089
  • 条件分支

    条件分支 if-else-fi [root@node1 test]# vim if.sh #!/bin/bash amswer=30 if [ $1 -gt $answer ];t…

    技术杂谈 2023年7月11日
    078
  • spark学习记录之withColumn重复计算

    在使用Spark,尤其是Spark SQL时,经常会出现一些奇奇怪怪的效率低下问题。比如说,如果lineage比较长的时候,或者lineage比较复杂需要shuffle的时候,可能…

    技术杂谈 2023年6月21日
    081
  • Spring Ioc源码分析系列–容器实例化Bean的四种方法

    Spring Ioc源码分析系列–实例化Bean的几种方法 前言 前面的文章Spring Ioc源码分析系列–Bean实例化过程(二)在讲解到bean真正通…

    技术杂谈 2023年7月25日
    075
  • Laravel项目中使用GroupBy时报错

    今天用Laravel做一个新的项目,GroupBy一个字段内容为中文时候,一直报错。 $list = ApCategories::where(‘site_code’, ‘MY’) …

    技术杂谈 2023年7月11日
    070
  • 【SSM框架】Spring笔记 – AOP详解;AspectJ中四种通知的使用

    1、面向切面编程AOP AOP(Aspect Orient Programming),面向切面编程。 切面:公共的,通用的,重复的功能称为切面,面向切面编程就是将切面提取出来,单独…

    技术杂谈 2023年7月10日
    091
  • 五分钟掌握CloudCanal的数据校验与数据订正

    简述 CloudCanal除了提供最核心的数据迁移和同步能力以外,还提供数据校验和数据订正两种非常实用的能力。这两种功能为用户保障数据迁移同步链路的数据质量提供了非常大的便利性。例…

    技术杂谈 2023年7月23日
    081
  • 分析自动打卡脚本——大一入学遗作

    HTTP协议 1.何为HTTP协议 HTTP协议又名超文本传输协议,是一种基于TCP/IP的传输协议,顾名思义,其传输的内容为超文本内容,在互联网早期,我们只能传输非二进制的文本,…

    技术杂谈 2023年7月11日
    070
  • Redis管理及监控工具推荐

    推荐一款Redis管理软件。【官网 http://www.redisant.cn/】 功能描述: 键和字段CRUD和glob。 适用于字符串、列表、散列、集合、有序集合。 通过漂亮…

    技术杂谈 2023年7月24日
    069
  • 接口测试

    :配置windows中特定应用的抓包(默认抓取不到) :添加备注信息 :重新发起指定请求 :清空指定会话内容 :断点放行 :模式切换 :相应数据解码 :抓取指定进程发出的请求 :关…

    技术杂谈 2023年7月25日
    068
  • Spring事务(四)-事务失效场景

    有时候,我们明明在类或者方法上添加了 @Transactional注解,却发现方法并没有按事务处理。其实,以下场景会导致事务失效。 1、事务方法所在的类没有加载到Spring IO…

    技术杂谈 2023年7月11日
    065
  • 说说用户线程和守护线程

    什么是用户线程和守护线程? 守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如 垃圾回收线程、 JIT线程都是 守护线程。与之对应的是 用户线程,用户线程可以理解为是…

    技术杂谈 2023年6月21日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球