文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

编程语言中负载均衡常见算法有哪些

2023-06-16 19:52

关注

这篇文章跟大家分析一下“编程语言中负载均衡常见算法有哪些”。内容详细易懂,对“编程语言中负载均衡常见算法有哪些”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“编程语言中负载均衡常见算法有哪些”的知识吧。

 

编程语言中负载均衡常见算法有哪些

冷备与热备

fail-over与fail-back

冗余类型

1.主备方式(Active-Standby)

准备两台路由器,其中一台作为正常运行业务的活跃设备(active),也可以称为主设备(master)或者首要设备(primary)。另一台作为发生故障时替换的备用设备(standby),也可以称为备机(backup)、从设备(slave)、必要设备(secondary)。活跃设备和备用设备必须共享关于设备的设置信息。

2.双活方式(Active-Active)

准备两台路由器,其中一台作为首要设备(primary),另一台作为次要设备(secondary),二者同时运行来组成冗余结构。这种方式可以通过与负载均衡设备并用或者设置DNS、客户端一侧的路由信息来达到负载均衡的目的。

3.集群方式(Cluster)

在主备方式或双活方式中,使用3台以上的硬件协同组成冗余结构的方式。

什么是负载均衡

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

负载均衡算法在很多地方都有使用,无论是在服务治理中或者是在分布式缓存中都大量的使用,本文主要介绍几种常见的负载均衡的算法.

1.轮询法

轮询法,很好理解,将请求按照顺序轮流的分配到服务器上,他均衡的对待每一台后端的服务器,不关心服务器的的连接数和负载情况.以下代码演示了这种算法.

public class BalanceServer {  public static List<String> servers =  Arrays.asList("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4",  "192.168.0.5");  public static int pos = 0;  public static String getServer() {  String server = null;  if (pos >= servers.size()) {  pos = 0;  }  server = servers.get(pos);  pos++;  return server;  }  public static void main(String[] args) {  for(int i=0;i<10;i++){  System.out.println(BalanceServer.getServer());  }  } }

轮询的策略目的在于请求的绝对均衡,但是在实际的情况下,可能服务器并不是完全一样,导致有些性能高的服务器不能完全发挥出来.

2.随机法

通过系统的随机函数,根据后端服务器列表的大小来随机获取其中的一台来访问,随着调用量的增大,实际效果越来越近似于平均分配到没一台服务器.和轮询的效果类似,  代码如下:

public class BalanceServer {  public static List<String> servers = Arrays.asList("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4",  "192.168.0.5");  public static int pos = 0;  public static String getServer() {  String server = null;  Random random = new Random();  int randomPos = random.nextInt(servers.size());  server = servers.get(randomPos);  return server;  } }

和轮询算法比较,在并发的场景下,轮询需要加锁,随机法想比而言性能好点.

3.源地址hash法

源地址hash法的思想是获取客户端访问的ip地址,通过hash函数计算出一个hash值,用该hash值对服务器列表的大小进行取模运算,得到的值就是要访问的服务器的序号,代码如下:

public class BalanceServer {  public static List<String> servers = Arrays.asList("192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4",  "192.168.0.5");  public static int pos = 0;  public static String getServer(String ip) {  String server = null;  int hashCode = ip.hashCode();  pos = hashCode % servers.size();  server = servers.get(pos);  return server;  } }

hash法的好处是,在服务器列表不变的情况下,每次客户端访问的服务器都是同一个服务器.利用这个特性可以有状态的session会话.无需额外的操作就可以实现粘性会话.

4.加权轮询法

刚刚有说道过,不同的服务器性能不同,所以不能一概而论,需要给性能低的服务器给比较低的权重,性能高的给跟高的权重,代码如下:

public class BalanceServer {  public static Map<String, Integer> serverMap = new HashMap<String, Integer>();  public static int pos = 0;  static {  serverMap.put("192.168.0.1", 1);  serverMap.put("192.168.0.2", 1);  serverMap.put("192.168.0.3", 4);  serverMap.put("192.168.0.4", 3);  serverMap.put("192.168.0.5", 3);  serverMap.put("192.168.0.6", 2);  }  public static String getServer() {  Set<String> keySet = serverMap.keySet();  Iterator<String> it = keySet.iterator();  List<String> servers = new ArrayList<String>();  while (it.hasNext()) {  String server = it.next();  Integer weight = serverMap.get(server);  for (int i = 0; i < weight; i++) {  servers.add(server);  }  }  String server = null;  if (pos >= servers.size()) {  pos = 0;  }  server = servers.get(pos);  pos++;  return server;  }  public static void main(String[] args) {  for(int i=0;i<14;i++){  System.out.println(BalanceServer.getServer());  } 35 } 36}

5.加权随机法

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

public class WeightRandom {  public static String getServer()  {  // 重建一个Map,避免服务器的上下线导致的并发问题  Map<String, Integer> serverMap =   new HashMap<String, Integer>();  serverMap.putAll(IpMap.serverWeightMap);  // 取得Ip地址List  Set<String> keySet = serverMap.keySet();  Iterator<String> iterator = keySet.iterator();  List<String> serverList = new ArrayList<String>();  while (iterator.hasNext())  {  String server = iterator.next();  int weight = serverMap.get(server);  for (int i = 0; i < weight; i++)  serverList.add(server);  }  java.util.Random random = new java.util.Random();  int randomPos = random.nextInt(serverList.size());  return serverList.get(randomPos);  } }

关于编程语言中负载均衡常见算法有哪些就分享到这里啦,希望上述内容能够让大家有所提升。如果想要学习更多知识,请大家多多留意小编的更新。谢谢大家关注一下编程网网站!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯