负载均衡算法及其Java代码实现

通达信短周期指标盘中实时监控与预警选股实战指南 在量化交易与短线投资中,实时监控与预警选股是提升决策效率的关键技术。其原理基于本地数据存储与公式计算,通过分钟级数据引用和动态过滤机制,实现低延迟信号触发。技术价值在于自动化筛选与即时提醒,减少人工盯盘误差。应用场景包括T+0交易、多标的监控及盘中异动捕捉。通达信平台凭借灵活的公式系统和本地数据优势,支持自定义指标与分层预警,帮助投资者构建高效的短周期监控体系。 阅读详情

什么是负载均衡

负载均衡,英文 名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种 负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服 务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能。

负载均衡分为软件负载均衡和硬件负载均衡,前者的代表是阿里章文嵩博士研发的LVS,后者则是均衡服务器比如F5,当然这只是提一下,不是重点。

本文讲述的是"将外部发送来的请求均匀分配到对称结构中的某一台服务器上"的各种算法,并以Java代码演示每种算法的具体实现,OK,下面进入正题,在进入正题前,先写一个类来模拟Ip列表:

复制代码
复制代码
 1 public class IpMap
 2 {  3 // 待路由的Ip列表,Key代表Ip,Value代表该Ip的权重  4 public static HashMap<String, Integer> serverWeightMap =  5 new HashMap<String, Integer>();  6  7 static  8  {  9 serverWeightMap.put("192.168.1.100", 1); 10 serverWeightMap.put("192.168.1.101", 1); 11 // 权重为4 12 serverWeightMap.put("192.168.1.102", 4); 13 serverWeightMap.put("192.168.1.103", 1); 14 serverWeightMap.put("192.168.1.104", 1); 15 // 权重为3 16 serverWeightMap.put("192.168.1.105", 3); 17 serverWeightMap.put("192.168.1.106", 1); 18 // 权重为2 19 serverWeightMap.put("192.168.1.107", 2); 20 serverWeightMap.put("192.168.1.108", 1); 21 serverWeightMap.put("192.168.1.109", 1); 22 serverWeightMap.put("192.168.1.110", 1); 23  } 24 }
复制代码
复制代码

 

轮询(Round Robin)法

轮询法即Round Robin法,其代码实现大致如下:

复制代码
复制代码
 1 public class RoundRobin
 2 {  3 private static Integer pos = 0;  4  5 public static String getServer()  6  {  7 // 重建一个Map,避免服务器的上下线导致的并发问题  8 Map<String, Integer> serverMap =  9 new HashMap<String, Integer>(); 10  serverMap.putAll(IpMap.serverWeightMap); 11 12 // 取得Ip地址List 13 Set<String> keySet = serverMap.keySet(); 14 ArrayList<String> keyList = new ArrayList<String>(); 15  keyList.addAll(keySet); 16 17 String server = null; 18 synchronized (pos) 19  { 20 if (pos > keySet.size()) 21 pos = 0; 22 server = keyList.get(pos); 23 pos ++; 24  } 25 26 return server; 27  } 28 }
复制代码
复制代码

由于serverWeightMap中的地址列表是动态的,随时可能有机器上线、 下线或者宕机,因此为了避免可能出现的并发问题,方法内部要新建局部变量serverMap,现将serverMap中的内容复制到线程本地,以避免被多 个线程修改。这样可能会引入新的问题,复制以后serverWeightMap的修改无法反映给serverMap,也就是说这一轮选择服务器的过程中, 新增服务器或者下线服务器,负载均衡算法将无法获知。新增无所谓,如果有服务器下线或者宕机,那么可能会访问到不存在的地址。因此,服务调用端需要有相应的容错处理,比如重新发起一次server选择并调用。

对于当前轮询的位置变量pos,为了保证服务器选择的顺序性,需要在操作时对其加锁,使得同一时刻只能有一个线程可以修改pos的值,否则当pos变量被并发修改,则无法保证服务器选择的顺序性,甚至有可能导致keyList数组越界。

轮询法的优点在于:试图做到请求转移的绝对均衡。

轮询法的缺点在于:为了做到请求转移的绝对均衡,必须付出相当大的代价,因为为了保证pos变量修改的互斥性,需要引入重量级的悲观锁synchronized,这将会导致该段轮询代码的并发吞吐量发生明显的下降。

 

随机(Random)法

通过系统随机函数,根据后端服务器列表的大小值来随机选择其中一台进行访问。由概率统计理论可以得知,随着调用量的增大,其实际效果越来越接近于平均分配流量到每一台后端服务器,也就是轮询的效果。

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

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

整体代码思路和轮询法一致,先重建serverMap,再获取到server列表。在选取server的时候,通过Random的nextInt方法取0~keyList.size()区间的一个随机值,从而从服务器列表中随机获取到一台服务器地址进行返回。基于概率统计的理论,吞吐量越大,随机算法的效果越接近于轮询算法的效果。

 

源地址哈希(Hash)法

源地址哈希的思想是获取客户端访问的IP地址值,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是要访问的服务器的序号。源地址哈希算法的代码实现大致如下:

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

前两部分和轮询法、随机法一样就不说了,差别在于路由选择部分。通过客户端的ip也就是remoteIp,取得它的Hash值,对服务器列表的大小取模,结果便是选用的服务器在服务器列表中的索引值。

源地址哈希法的优点在于:保证了相同客户端IP地址将会被哈希到同一台后端服务器,直到后端服务器列表变更。根据此特性可以在服务消费者与服务提供者之间建立有状态的session会话。

源地址哈希算法的缺点在于:除非集群中服务器的非常稳定,基本不会上下线,否则一旦有服务器上线、下线,那么通过源地址哈希算法路由到的服务器是服务器上线、下线前路由到的服务器的概率非常低,如果是session则取不到session,如果是缓存则可能引发"雪崩"。如果这么解释不适合明白,可以看我之前的一篇文章MemCache超详细解读,一致性Hash算法部分。

 

加权轮询(Weight Round Robin)法

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

复制代码
复制代码
 1 public class WeightRoundRobin
 2 {  3 private static Integer pos;  4  5 public static String getServer()  6  {  7 // 重建一个Map,避免服务器的上下线导致的并发问题  8 Map<String, Integer> serverMap =  9 new HashMap<String, Integer>(); 10  serverMap.putAll(IpMap.serverWeightMap); 11 12 // 取得Ip地址List 13 Set<String> keySet = serverMap.keySet(); 14 Iterator<String> iterator = keySet.iterator(); 15 16 List<String> serverList = new ArrayList<String>(); 17 while (iterator.hasNext()) 18  { 19 String server = iterator.next(); 20 int weight = serverMap.get(server); 21 for (int i = 0; i < weight; i++) 22  serverList.add(server); 23  } 24 25 String server = null; 26 synchronized (pos) 27  { 28 if (pos > keySet.size()) 29 pos = 0; 30 server = serverList.get(pos); 31 pos ++; 32  } 33 34 return server; 35  } 36 }
复制代码
复制代码

与轮询法类似,只是在获取服务器地址之前增加了一段权重计算的代码,根据权重的大小,将地址重复地增加到服务器地址列表中,权重越大,该服务器每轮所获得的请求数量越多。

 

加权随机(Weight Random)法

与加权轮询法类似,加权随机法也是根据后端服务器不同的配置和负载情况来配置不同的权重。不同的是,它是按照权重来随机选择服务器的,而不是顺序。加权随机法的代码实现如下:

复制代码
复制代码
 1 public class WeightRandom
 2 {  3 public static String getServer()  4  {  5 // 重建一个Map,避免服务器的上下线导致的并发问题  6 Map<String, Integer> serverMap =  7 new HashMap<String, Integer>();  8  serverMap.putAll(IpMap.serverWeightMap);  9 10 // 取得Ip地址List 11 Set<String> keySet = serverMap.keySet(); 12 Iterator<String> iterator = keySet.iterator(); 13 14 List<String> serverList = new ArrayList<String>(); 15 while (iterator.hasNext()) 16  { 17 String server = iterator.next(); 18 int weight = serverMap.get(server); 19 for (int i = 0; i < weight; i++) 20  serverList.add(server); 21  } 22 23 java.util.Random random = new java.util.Random(); 24 int randomPos = random.nextInt(serverList.size()); 25 26 return serverList.get(randomPos); 27  } 28 }
复制代码
复制代码

这段代码相当于是随机法和加权轮询法的结合,比较好理解,就不解释了。

 

最小连接数(Least Connections)法

前面几种方法费尽心思来实现服务消费者请求次数分配的均衡,当然这么做是没错的,可以为后端的多台服务器平均分配工作量,最大程度地提高服务器的利用率,但是实际情况是否真的如此?实际情况中,请求次数的均衡真的能代表负载的均衡吗?这是一个值得思考的问题。

上面的问题,再换一个角度来说就是:以后端服务器的视角来观察系统的负载,而非请求发起方来观察。最小连接数法便属于此类。

最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有 快有慢,它正是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前请求,尽可能地提高后端服务器的利用效率,将负载 合理地分流到每一台机器。由于最小连接数设计服务器连接数的汇总和感知,设计与实现较为繁琐,此处就不说它的实现了。

多种负载均衡算法及其Java代码实现 首先给大家介绍下什么是负载均衡 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备和 服务器的带宽、增加 吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web 服务器、 FTP服务器、 企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。 本文讲述的是”将外部发送来的请求均匀分配到对称结构中的某一台服务器上”的各种算法,并以Java代码演示每种算法的 阅读详情

相关推荐

Arduino应用——PWM控制直流电机风扇

Arduino应用——PWM控制直流电机风扇PWM原理实验器件功能描述如何改变文本的样式插入链接与图片实现代码生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近在使用arduino UNO开发板完成课程小作业。其中一个要求设计一个电风扇控制系统,要求能够通过PWM调节风扇的转速。期间搜索了许多例程和方法,但受限于器件,效果不

hypecycle的博客 2万+

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

什么是负载均衡 负载均衡,英文 名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种 负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服 务器阵列,借此提供快速获取重要数据,解决大量...

aocanxie0661的博客 276

VIVADO & VITIS 报错记录

问题详情:使用BD用DMA上传少量数据,根据ILA监测到的AXI总线数据正常,VALID信号和READY信号都正常,但是在PS端的cache缓冲区示数为0,打印为0。可能是因为print和printf混用导致。解决方案:修改缓冲区的对齐参数。

Mulun_Zhu的博客 715

详解常见负载均衡算法在Java中的实现

一致性哈希算法中,就利用哈希环结构+哈希取模判断每个请求该落入的服务器,由于服务器IP、客户端IP或缓存的Key都是相同的,所以在服务器数量不变的情况,相同的哈希条件进行哈希取模,最终计算出来的值永远都是相同的。与前面分析的最小活跃数算法一样,最优响应算法也是一种动态算法,但它比最小活跃数算法更加智能,因为最小活跃数算法中,如果一台节点存在故障,导致它自身处理的请求数比较少,那么它会遭受最大的访问压力,这显然是并不合理的。遍历之前配置的服务器列表,用随机索引与每个节点的权重值进行判断。...........

shadow_zed的博客 2399

SpyGlass Lint脚本实战:如何用TCL自动化RTL代码检查(附完整配置模板)

本文详细介绍了如何利用TCL脚本实现SpyGlass Lint工具的自动化RTL代码检查。通过构建模块化、工程化的脚本框架,文章提供了从环境搭建、核心配置、规则定制到豁免管理的完整实战指南,并附有可复用的配置模板,旨在帮助IC设计工程师构建高效、一致的代码质量检查流水线。

weixin_29204205的博客 134

Linux-RGMII PHY 88E1512 驱动调试记录

1. 简介 1)开发板平台:创龙 AM5728 (tl5728-easy-evm) 2)PHY芯片:Marvell 88E1512 88E1512和88E1510都是一个系列的phy,采用marvell的通用phy驱动,驱动源码路径如下:drivers/net/phy/marvell.c 2. 应用场景 1)系统框图 AM5728连接两个PHY,PHY0的工作模式是 RGMII to Copper (RGMII到电口),PHY1的工作模式是 RGMII to SGMII。 两个PHY与处理器的连接方式都是

weixin_40407893的博客 2万+

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

几种简单的负载均衡算法及其Java代码实现1、轮询2、加权轮询3、源地址哈希4、随机5、加权随机6、最小连接数nignx 负载均衡的几种算法介绍1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。2、weight(轮询权值)weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况...

weixin_33001305的博客 334

【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞

【代码】【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞。

weixin_41369892的博客 901

Java开发 - 负载均衡你了解多少?

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器FTP服务器企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。通俗点来讲,就好比你要去蹲坑,坑位有五六七八个,你去哪个坑都能解决你的问题,你可能这次去一号坑,下次二号坑......总之,可随机;也可以你自己喜欢哪个坑就常去哪个坑,这个叫权重;甚至你可以每次不重样,这就是轮训。

CodingFire的博客 2043

基于深度学习的三维重建算法——详解与实现

随着深度学习技术的迅猛发展,基于深度学习的三维重建算法在最近几年取得了显著的进展。而基于深度学习的三维重建算法通过利用深度神经网络,能够从大规模数据中学习到更准确、鲁棒的三维结构表示。本文综述了基于深度学习的三维重建算法,并给出了相应的源代码。随着深度学习技术的不断发展,我们相信基于深度学习的三维重建算法将会在未来得到更广泛的应用。实验结果表明,基于深度学习的三维重建算法在准确性和鲁棒性方面取得了显著的提升。以上是关于基于深度学习的三维重建算法的详细介绍与实现,希望对您有所帮助。

CyberGenius的博客 1227

【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部

本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~ 文章目录本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~一、项目展示二、项目资源共享1:训练图片:香烟图片+吸烟手势+烟雾三、

cv君的博客 13万+

java ftp 教程_java教程之在JAVA应用程序中如何实现FTP的功能

在JAVA的编程中,您也许会遇到FTP方面的编程,本文就来演示如何实现它。---- 本程序是由JBUILDER2.0来开发的,为了节约篇幅我只列出主要的三个部份。FtpList 部分是用来显示FTP服务器上的文件(附图略)。GetButton部分为从FTP服务器下传一个文件。PutButton 部分为向FTP服务器上传一个文件。别忘了在程序中还要引入两个库文件(import sun.net.*,i...

weixin_31473011的博客 267

AUTOSAR知识点:PDUR(PDU Router)基础知识

通过定义路由表和实现相应的路由和缓冲逻辑,PDUR能够确保PDU在不同ECU之间的可靠传输。在上述示例中,我们定义了一个简单的PDUR路由表,其中列出了源ECU和目标ECU之间的映射关系。当收到来自源ECU的PDU时,PDUR模块会根据路由表查找目标ECU,并将PDU传输到相应的目标ECU。PDUR的主要功能是将接收到的PDU从一个ECU路由到另一个ECU,并确保数据的正确传输。需要注意的是,上述示例是一个简化的实现,实际的PDUR模块可能包含更复杂的功能和逻辑。

EcmFsharp的博客 1157

Java代码实现负载均衡五种算法

前言: 负载均衡是为了解决并发情况下,多个请求访问,把请求通过提前约定好的规则转发给各个server。其中有好几个种经典的算法。在用java代码编写这几种算法之前,先来了解一下负载均衡这个概念。 1.概念 负载,从字面意思可以分析,是指后端server可以承受的压力。这个一方面是服务器的性能,另一方面就是代码的质量了。 均衡,就是说把服务部署在多态server,如何调度这些资源。根据服务器性能不同...

likunpeng6656201的博客 294

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

目录 什么是负载均衡 轮询(Round Robin)法 随机(Random)法 源地址哈希(Hash)法 加权轮询(Weight Round Robin)法 加权随机(Weight Random)法 最小连接数(Least Connections)法 什么是负载均衡 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的...

凡是过往,皆为序章 1040

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java负载均衡原理_多种负载均衡算法及其 Java 代码实现

首先给我们介绍下什么是负载均衡负载均衡 树立在现有网络结构之上,它供给了一种廉价有用通明的办法扩展 网络设备和 效劳器的带宽、添加 吞吐量、加强网络数据处理才能、进步网络的灵敏性和可用性。负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行履行,例如Web 效劳器、 FTP效劳器、 企业要害应用效劳器和其它要害使命效劳器等,然后共同完成工作使命。多种负载均衡算法及其Ja...

weixin_42498163的博客 439

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

本文介绍了三种简单的负载均衡算法,分别是轮询算法、随机算法和加权轮询算法,同时给出了Java代码实现。这些算法可根据不同的系统场景和需要选择使用,帮助均衡分配请求,提高系统性能和稳定性。

qq_28245087的博客 1401
上一篇: Java应用架构的演化之路
下一篇: 浅谈Java中的hashcode方法
andybbc
博客等级 码龄11年 64粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值