Java程序员必知四种负载均衡算法

news2024/11/30 2:25:10

前言

一般来说,我们在设计系统的时候,为了系统的高扩展性,会尽可能的创建无状态的系统,这样我们就可以采用集群的方式部署,最终很方便的根据需要动态增减服务器数量。但是,要使系统具有更好的可扩展性,除了无状态设计之外,还要考虑采用什么负载均衡算法,本文就带领大家认识以下常见的4种负载均衡算法。

什么是负载均衡

负载均衡是指多台服务器以对称的方式组成一个服务器集群。每台服务器的地位相当(但不同的服务器可能性能不同),可以独立提供服务,无需其他服务器的辅助。为了保证系统的可扩展性,需要有一种算法能够将系统负载平均分配给集群中的每台服务器。这种算法称为负载均衡算法。负责执行负载均衡算法并平均分配请求的服务器称为负载均衡器。

随机算法

随机算法非常简单,该算法的核心是通过随机函数随机获取一个服务器进行访问。假设我们现在有四台服务器,192.168.1.1~ 192.168.1.4, 该算法用java实现大致如下:

public class RandomTest {

    private static final List<String> servers = Arrays.asList("192.168.1.1", "192.168.1.2", "192.168.1.3", "192.168.1.4");

    public static String getServer() {
        Random random = new Random();
        int index = random.nextInt(servers.size());
        return servers.get(index);
    }


    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            String server = getServer();
            System.out.println("select server: "+server);
        }
    }
}
复制代码

当样本较小时,算法可能分布不均匀,但根据概率论,样本越大,负载会越均匀,而负载均衡算法本来就是为应对高并发场景而设计的。该算法的另一个缺点是所有机器都有相同的访问概率, 如果服务器性能不同,负载将不平衡。

轮询算法

Round-Robin轮询算法是另一种经典的负载均衡算法。请求以循环的方式分发到集群中的所有服务器。同理,对于上述四台服务器,假设客户端向集群发送10个请求,则请求分布将如下图所示:

在十个请求中,第一、第五和第九个请求将分配给192.168.1.1,第二、第六和第十个请求将分配给192.168.1.2,依此类推。我们可以看到round-robin算法可以在集群中均匀的分配请求。但是,该算法具有与随机算法相同的缺点,如果服务器性能不同,负载将不平衡,因此需要加权轮询算法。

加权轮询算法

Weighted Round-Robin加权轮询算法是在round-robin算法的基础上根据服务器的性能分配权重。服务器能支持的请求越多,权重就越高,分配的请求也就越多。对于同样的10个请求,使用加权轮询算法的请求分布会如下图所示:

可以看到192.168.1.4权重最大,分配的请求数最多。看一下使用Java简单实现的以下加权循环算法。

public class RoundRobinTest {

    public class Node{
        private String ip;

        private Integer weight;

        private Integer currentWeight;

        public Node(String ip,Integer weight) {
            this.ip = ip;
            this.weight = weight;
            this.currentWeight = weight;
        }

        public String getIp() {
            return ip;
        }

        public void setIp(String ip) {
            this.ip = ip;
        }

        public Integer getWeight() {
            return weight;
        }

        public void setWeight(Integer weight) {
            this.weight = weight;
        }

        public Integer getCurrentWeight() {
            return currentWeight;
        }

        public void setCurrentWeight(Integer currentWeight) {
            this.currentWeight = currentWeight;
        }
    }

    List<Node> servers = Arrays.asList(
            new Node("192.168.1.1",1),
            new Node("192.168.1.2",2),
            new Node("192.168.1.3",3),
            new Node("192.168.1.4",4));
    private Integer totalWeight;

    public RoundRobinTest() {
        this.totalWeight = servers.stream()
                .mapToInt(Node::getWeight)
                .reduce((a,b)->a+b).getAsInt();
    }


    public String getServer() {
        Node node = servers.stream().max(Comparator.comparingInt(Node::getCurrentWeight)).get();
        node.setCurrentWeight(node.getCurrentWeight()-totalWeight);
        servers.forEach(server->server.setCurrentWeight(server.getCurrentWeight()+server.getWeight()));
        return node.getIp();
    }


    public static void main(String[] args) {
        RoundRobinTest roundRobinTest = new RoundRobinTest();
        for (int i = 0; i < 10; i++) {
            String server = roundRobinTest.getServer();
            System.out.println("select server: "+server);
        }
    }
复制代码

该算法的核心是的动态计算currentWeight。每个服务器被选中后,currentWeight需要减去所有服务器的权重之和,这样可以避免权重高的服务器一直被选中。权重高的服务器有更多的分配请求,请求可以平均分配给所有服务器。

哈希算法

哈希算法,顾名思义,就是利用哈希表根据 计算出请求的路由hashcode%N。这里hashcode代表哈希值,N代表服务器数量。该算法的优点是实现起来非常简单。具体实现如下:

rivate static final List<String> servers = Arrays.asList("192.168.1.1", "192.168.1.2", "192.168.1.3", "192.168.1.4");

    public static String getServer(String key) {
        int hash = key.hashCode();
        int index =  hash%servers.size();
        return servers.get(index);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            String server = getServer(String.valueOf(i));
            System.out.println("select server: "+server);
        }
    }
复制代码

哈希算法在很多缓存分布式存储系统中很常见,比如MemorycachedRedis,但是一般不会用到上面的哈希算法,而是优化后的一致性哈希算法。

总结

本文总结了负载均衡常见的4种算法,我们可以发现nginx或者spring cloud中的ribbon都使用到了这样的算法思想,我们可以根据自己的业务场景选择合适算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

直观理解--马氏距离

首先我们很了解欧氏距离了&#xff0c;就是用来计算欧式空间&#xff08;就是我们常见的坐标系&#xff09;中两个点的距离的。 比如点 x(x1,…,xn)x (x_1,…,x_n)x(x1​,…,xn​) 和 y(y1,…,yn)y (y_1,…,y_n)y(y1​,…,yn​) 的欧氏距离为&#xff1a; d(x,y)(x1−y1)2(x2…

依靠小游戏带动产品增收,app运营这样做

大家都玩过小游戏吧&#xff1f;从小时候的4399游戏平台到现在的微信小游戏&#xff0c;尤其是风靡一时的“跳一跳”和“羊了个羊”都曾上榜热搜&#xff0c;让人印象深刻。在当下小游戏爆火社交平台的不断出现的背景下&#xff0c;小游戏的发展劲头更是强盛。 小游戏的吸引力在…

Memblaze发布大容量企业级SSD:支持32T最大容量,性能更强!

2023年1月10日 —— 今天&#xff0c;北京忆恒创源科技股份有限公司&#xff08;Memblaze&#xff09;正式发布 PBlaze6 6930 系列 PCIe 4.0 企业级 NVMe SSD。PBlaze6 6930 面向企业高性能业务应用开发&#xff0c;有着 1600K/680K IOPS 的 4K 随机读/写性能&#xff0c;具备更…

Mysql常见面试题

Mysql常见面试题汇总①⭐事务的基本特性和隔离级别⭐ACID靠什么保证⭐什么是MVCC⭐mysql的主从同步原理简述MyISAM和InnoDB的区别简述mysql中索引类型以及对数据库的性能影响⭐索引的基本原理Mysql聚簇索引和非聚簇索引的区别⭐B树和B树的区别&#xff0c;为什么Mysql使用B树My…

第04讲:Docker部署MySQL8

MySQL 的 Docker 镜像在 dockerhub 上的地址&#xff1a;https://hub.docker.com//mysql 当前&#xff08;2021-04-02&#xff09;的 latest 和 8.0.23 是同一个镜像 。另外&#xff0c;5.7 版本和 5.7.33 是同一个镜像 第1步&#xff1a;安装mysql 查询中央仓库 docker se…

Kestrel封装在WindowService中(.net5,.net6,.net7三个版本的介绍)

Kestrel封装在WindowServer中背景关于WindowsServer开发服务.NET5版本建项目添加Controller添加引用修改Startup.cs修改Program.cs配置Kestrel监听发布程序通过命令行创建服务关于SC命令启动服务查看效果测试效果.NET6错误1解决办法&#xff1a;错误2运行效果如下图.NET7版本&a…

千锋教育嵌入式物联网教程之系统编程篇学习-01

目录 课程视频链接 笔记目的 什么是系统编程 如何操作内核的系统调用 系统调用的分类​编辑 系统调用的返回值 系统调用IO函数 文件描述符 文件IO文件描述符与标准IO的文件指针对应关系 Man手册使用 open函数 函数调用失败打印错误 close函数 测试一个进程最多能产生多少个…

如何准备pmp考试?

一、考前五准备 1.知识准备&#xff1a;读透教材&#xff0c;仔细回顾知识点&#xff0c;明确知识框架&#xff0c;模考题考前正确率达到95%。 2.精神准备&#xff1a;明确目标&#xff0c;有信心&#xff0c;不要焦虑。 3.精力准备&#xff1a;科学安排考前的复习和休息时间…

【nvivo11plus教程】03_查询+自动编码

注&#xff1a;nvivo11也可以使用自动编码的。我是在第一次使用自动编码的时候&#xff0c;它弹出来一个界面让我下载安装包&#xff0c;但是网速特别慢&#xff0c;需要5、6个小时&#xff0c;然后我电脑开了一个晚上&#xff0c;第二天早上显示下载失败&#xff0c;但是可以使…

十一、路由

一、前端路由的概念与原理 1.1、什么是路由 路由&#xff08;英文&#xff1a;router&#xff09;就是对应关系。 1.2、SPA与前端路由 SPA 指的是一个web网站只有唯一的一个HTML页面&#xff0c;所有组件的展示与切换都在这唯一的一个页面内完成。此时&#xff0c;不同组件…

【 java 集合】Collections工具类的使用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

python基础语法二

一、条件判断 1.1 if…else…语句 if…else… 字面意思就是 如果…否则… num 3 # 通过取模运算判断num是否能被2整除 if num % 2 0:print(str(num) "是一个偶数") else:print(str(num) "是一个奇数")注意两条print语句前面的缩进 1.2 elif 当你有三…

DP4809国产双通道耳机音频功率放大器芯片兼容替代LM4809

目录DP4809简介参考原理图DP4809芯片特性DP4809简介 DP4809是带关机功能的双通道耳机音频功率放大器芯片。在5V输入工作电压下&#xff0c;负载 16Ω时&#xff0c;平均输出功率为 140mW&#xff0c;总谐波失真 THDN 小于0.1%。当 SHUTDOWN 管脚电压为 GND 时&#xff0c;芯片…

小程序技术科普:运行机制安全机制

接触小程序有一段时间了&#xff0c;总得来说小程序开发门槛比较低&#xff0c;但其中基本的运行机制和原理还是要懂的。 了解小程序的由来 在小程序没有出来之前&#xff0c;最初微信WebView逐渐成为移动web重要入口&#xff0c;微信发布了一整套网页开发工具包&#xff0c;称…

Windows安装Pytorch+CUDA环境

文章目录前言创建Python虚拟环境安装CUDA安装Pytorch参考资料前言 本文将介绍使用 conda 创建Python虚拟环境&#xff0c;安装Pytorch和CUDA依赖。 创建Python虚拟环境 conda常用命令&#xff1a; conda create -n poppy_leo_tf python3.7 # 创建虚拟环境 conda activate p…

grafana关闭缓存

如果把Prometheus配置文件中的一些端口删除再重启服务&#xff0c;虽然Prometheus中更新了数据&#xff0c;但是grafana中的缓存会存在很长时间。 在官方文档[数据源管理|格拉法纳文档 (grafana.com)](https://grafana.com/docs/grafana/latest/administration/user-managemen…

Leetcode - 19 - 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1],…

【Dash搭建可视化网站】项目11:世界自杀率数据看板

世界自杀率数据看板1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 header.py文件完善3.4 api.py/api.ipynb文件完善3.4.1 获取Dropdown组件中的下拉标签信息3.4.2 获取Rangeslider组件中的时间区间3.4.3 获取Checklist组件中…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第五篇】【完结篇附源码】

在第四篇中我们学习了mixin 公共方法封装&#xff0c; VueRouter 的使用以及配置权限路由&#xff0c;本期我们将讲述 Pinia,并使用 Pinia 和 Axios接口数据完成登录功能以权限路由改造 本期需要掌握的知识如下: Pinia 在项目中的使用及 持久化使用 Pinia 和 Axios 完成 登录 …

VIMA: General Robot Manipulation with Multimodal Prompts

Paper name VIMA: General Robot Manipulation with Multimodal Prompts Paper Reading Note URL: https://arxiv.org/pdf/2210.03094.pdf Project URL: https://vimalabs.github.io/ ICLR review URL: https://openreview.net/forum?idhzjQWjPC04A TL;DR ICLR 2023 在投…