负载均衡算法--随机法(Random) 向右看齐 2022-01-31 14:07 155阅读 0赞 接上一篇博文:[负载均衡算法–加权轮询法(Weight Round Robin)][Weight Round Robin],本文讲解随机算法。 通过随机算法从服务器列表中随机选取一台服务器进行访问。由概率论可以得知,随着客户端调用服务端的次数增多,其实际效果趋近于平均分配请求到服务端的每一台服务器,也就是达到轮询的效果。 ### 算法描述 ### 假设有 N 台服务器 S = \{S0, S1, S2, …, Sn\},算法可以描述为: 1、通过随机函数生成 0 到 N 之间的任意整理,将该数字作为索引,从 S 中获取对应的服务器; 假定我们现在有如下四台服务器: <table> <thead> <tr> <th>服务器地址</th> <th>权重</th> </tr> </thead> <tbody> <tr> <td>192.168.1.1</td> <td>1</td> </tr> <tr> <td>192.168.1.2</td> <td>2</td> </tr> <tr> <td>192.168.1.3</td> <td>3</td> </tr> <tr> <td>192.168.1.4</td> <td>4</td> </tr> </tbody> </table> 初始化服务列表后, serverList 如下: <table> <thead> <tr> <th>服务器地址</th> <th>序号</th> </tr> </thead> <tbody> <tr> <td>192.168.1.1</td> <td>1</td> </tr> <tr> <td>192.168.1.2</td> <td>2</td> </tr> <tr> <td>192.168.1.2</td> <td>3</td> </tr> <tr> <td>192.168.1.3</td> <td>4</td> </tr> </tbody> </table> 随机算法与服务器权重没有关系,每个服务器会被随机的访问到,由概率论可以得知,当样本量足够大时,每台服务器被访问到的几率近似是相等的,随机算法的效果就越趋近于轮询算法。 ### 代码实现 ### 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.Random; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; /** * @author zhibo * @date 2019/5/16 16:28 */ public class RandomBalance { public static String getServer() { Set<String> serverSet = ServerManager.serverMap.keySet(); ArrayList<String> serverList = new ArrayList<>(serverSet); Random random = new Random(); String server = serverList.get(random.nextInt(serverList.size())); return server; } public static void main(String[] args) { for (int i = 0; i < 10; i++) { String server = getServer(); System.out.println(server); } } } 1、使用 Random 对象随机生成 \[0, serverList.size()) 的整数,然后通过索引获取到服务器。 2、在多线程的情况下, 线程A修改 ServerManager.serverMap 的值,线程B无法即时拿到线程A修改后的值,因此可能会产生请求错误,需要调用端进行容错处理。 3、从宏观的角度讲,访问量越大负载越均衡;微观的角度讲,看起来没有那么均衡。 执行 main 方法输出结果如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly96aGliby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70] 文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。 [Weight Round Robin]: https://zhibo.blog.csdn.net/article/details/90268868 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly96aGliby5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70]: /images/20220131/c19e953fd93a41a48d6916109dfa41a9.png
还没有评论,来说两句吧...