加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

几种简单的负载均衡算法及其Java代码实现

发布时间:2019-04-19 08:46:29 所属栏目:业界 来源:博客园
导读:1.什么是负载平衡 负载平衡,英文 名称为Load Balance,指由多台处事器以对称的方法构成一个处事器荟萃,每台处事器都具有等价的职位,都可以单独对外提供处事而无须其他处事器的帮助。通过某种 负载分管技能,将外部发送来的哀求匀称分派到对称布局中的某

因为serverWeightMap中的地点列表是动态的,随时也许有呆板上线、 下线可能宕机,因此为了停止也许呈现的并发题目,要领内部要新建局部变量serverMap,现将serverMap中的内容复制到线程当地,以停止被多 个线程修改。这样也许会引入新的题目,复制往后serverWeightMap的修改无法反应给serverMap,也就是嗣魅这一轮选择处事器的进程中, 新增处事器可能下线处事器,负载平衡算法将无法获知。新增无所谓,假若有处事器下线可能宕机,那么也许会会见到不存在的地点。因此,处事挪用端必要有响应的容错处理赏罚,好比从头提倡一次server选择并挪用。

对付当前轮询的位置变量pos,为了担保处事器选择的次序性,必要在操纵时对其加锁,使得统一时候只能有一个线程可以修改pos的值,不然当pos变量被并发修改,则无法担保处事器选择的次序性,乃至有也许导致keyList数组越界。

轮询法的利益在于:试图做到哀求转移的绝对平衡。

轮询法的弱点在于:为了做到哀求转移的绝对平衡,必需支付相等大的价钱,由于为了担保pos变量修改的互斥性,必要引入重量级的气馁锁synchronized,这将会导致该段轮询代码的并发吞吐量产生明明的降落。

03.随机(Random)法

通过体系随机函数,按照后端处事器列表的巨细值来随机选择个中一台举办会见。由概率统计理论可以得知,跟着挪用量的增大,着实际结果越来越靠近于均匀分派流量到每一台后端处事器,也就是轮询的结果。

随机法的代码实现大抵如下:

  1. public class Random 
  2.     public static String getServer() 
  3.     { 
  4.         // 重建一个Map,停止处事器的上下线导致的并发题目 
  5.         Map<String, Integer> serverMap =  
  6.                 new HashMap<String, Integer>(); 
  7.         serverMap.putAll(IpMap.serverWeightMap); 
  8.  
  9.         // 取得Ip地点List 
  10.         Set<String> keySet = serverMap.keySet(); 
  11.         ArrayList<String> keyList = new ArrayList<String>(); 
  12.         keyList.addAll(keySet); 
  13.  
  14.         java.util.Random random = new java.util.Random(); 
  15.         int randomPos = random.nextInt(keyList.size()); 
  16.  
  17.         return keyList.get(randomPos); 
  18.     } 

整体代码思绪和轮询法同等,先重建serverMap,再获取到server列表。在选取server的时辰,通过Random的nextInt要领取0~keyList.size()区间的一个随机值,从而从处事器列表中随机获取到一台处事器地点举办返回。基于概率统计的理论,吞吐量越大,随机算法的结果越靠近于轮询算法的结果。

04.源地点哈希(Hash)法

源地点哈希的头脑是获取客户端会见的IP地点值,通过哈希函数计较获得一个数值,用该数值对处事器列表的巨细举办取模运算,获得的功效即是要会见的处事器的序号。源地点哈希算法的代码实现大抵如下:

  1. public class Hash 
  2.     public static String getServer() 
  3.     { 
  4.         // 重建一个Map,停止处事器的上下线导致的并发题目 
  5.         Map<String, Integer> serverMap =  
  6.                 new HashMap<String, Integer>(); 
  7.         serverMap.putAll(IpMap.serverWeightMap); 
  8.  
  9.         // 取得Ip地点List 
  10.         Set<String> keySet = serverMap.keySet(); 
  11.         ArrayList<String> keyList = new ArrayList<String>(); 
  12.         keyList.addAll(keySet); 
  13.  
  14.         // 在Web应用中可通过HttpServlet的getRemoteIp要领获取 
  15.         String remoteIp = "127.0.0.1"; 
  16.         int hashCode = remoteIp.hashCode(); 
  17.         int serverListSize = keyList.size(); 
  18.         int serverPos = hashCode % serverListSize; 
  19.  
  20.         return keyList.get(serverPos); 
  21.     } 

前两部门和轮询法、随机法一样就不说了,不同在于路由选择部门。通过客户端的ip也就是remoteIp,取得它的Hash值,对处事器列表的巨细取模,功效即是选用的处事器在处事器列表中的索引值。

源地点哈希法的利益在于:担保了沟通客户端IP地点将会被哈希到统一台后端处事器,直到后端处事器列表改观。按照此特征可以在处事斲丧者与处事提供者之间成立有状态的session会话。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读