负载均衡最佳实践及自定义负载均衡器
文章目录
- 负载均衡最佳实践及自定义负载均衡器
- 一、负载均衡概述
- 二、轮询负载均衡器
- (一)理论介绍
- (二)Java 实现示例
- (三)关键步骤
- (四)流程图
- 三、随机负载均衡器
- (一)理论介绍
- (二)Java 实现示例
- (三)关键步骤
- (四)流程图
- 四、加权随机负载均衡器
- (一)理论介绍
- (二)Java 实现示例
- (三)关键步骤
- (四)流程图
- 五、一致性哈希负载均衡器
- (一)理论介绍
- (二)Java 实现示例
- (三)关键步骤
- (四)流程图
- 六、自定义负载均衡器的应用场景与选择
负载均衡最佳实践及自定义负载均衡器
一、负载均衡概述
负载均衡是分布式系统中的关键技术,用于将来自客户端的请求合理地分配到多个后端服务器上,以提高系统的性能、可靠性和可扩展性。通过负载均衡,可以避免单个服务器因负载过高而出现性能瓶颈或故障,同时能够实现系统资源的高效利用。常见的负载均衡算法包括轮询、随机、加权随机、一致性哈希等。
二、轮询负载均衡器
(一)理论介绍
轮询算法按照顺序依次将请求分配到后端服务器列表中的每个服务器上,每个服务器被轮流选中的机会均等。这种算法简单公平,适用于后端服务器性能相近的场景。
(二)Java 实现示例
import java.util.List;public class RoundRobinLoadBalancer {private List<String> serverList;private int currentIndex = 0;public RoundRobinLoadBalancer(List<String> serverList) {this.serverList = serverList;}public String getNextServer() {if (serverList.isEmpty()) {return null;}String nextServer = serverList.get(currentIndex);currentIndex = (currentIndex + 1) % serverList.size();return nextServer;}
}
(三)关键步骤
- 初始化时传入后端服务器列表。
- 每次调用
getNextServer方法时,根据当前索引获取对应的服务器,并更新索引指向下一个服务器,当索引超出列表范围时,重置为 0。
(四)流程图
开始
|
|-- 初始化服务器列表和索引
| |
| |-- 接收请求
| | |
| | |-- 根据当前索引获取服务器
| | | |
| | | |-- 返回服务器地址
| | |
| | |-- 更新索引(索引 + 1,若超出列表大小则重置为 0)
结束
三、随机负载均衡器
(一)理论介绍
随机负载均衡器在后端服务器列表中随机选择一个服务器来处理请求。这种算法简单且能在一定程度上避免轮询算法可能出现的请求倾斜问题,但无法根据服务器性能差异进行智能分配。
(二)Java 实现示例
import java.util.List;
import java.util.Random;public class RandomLoadBalancer {private List<String> serverList;private Random random;public RandomLoadBalancer(List<String> serverList) {this.serverList = serverList;this.random = new Random();}public String getRandomServer() {if (serverList.isEmpty()) {return null;}int randomIndex = random.nextInt(serverList.size());return serverList.get(randomIndex);}
}
(三)关键步骤
- 初始化时传入后端服务器列表并创建随机数生成器。
- 当有请求时,使用随机数生成器生成一个在服务器列表范围内的随机索引,然后返回对应的服务器地址。
(四)流程图
开始
|
|-- 初始化服务器列表和随机数生成器
| |
| |-- 接收请求
| | |
| | |-- 生成随机索引
| | | |
| | | |-- 根据索引获取服务器
| | | | |
| | | | |-- 返回服务器地址
结束
四、加权随机负载均衡器
(一)理论介绍
加权随机负载均衡器考虑到后端服务器的性能差异,为每个服务器分配一个权重值,权重越大的服务器被选中的概率越高。它适用于服务器性能不一致的情况,能够更合理地分配负载。
(二)Java 实现示例
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class WeightedRandomLoadBalancer {private List<WeightedServer> serverList;private Random random;public WeightedRandomLoadBalancer(List<WeightedServer> serverList) {this.serverList = serverList;this.random = new Random();}public String getWeightedRandomServer() {if (serverList.isEmpty()) {return null;}// 计算总权重int totalWeight = 0;for (WeightedServer server : serverList) {totalWeight += server.getWeight();}// 生成随机数int randomNumber = random.nextInt(totalWeight);// 根据随机数选择服务器int currentWeight = 0;for (WeightedServer server : serverList) {currentWeight += server.getWeight();if (randomNumber < currentWeight) {return server.getServerAddress();}}return null;}// 加权服务器类private static class WeightedServer {private String serverAddress;private int weight;public WeightedServer(String serverAddress, int weight) {this.serverAddress = serverAddress;this.weight = weight;}public String getServerAddress() {return serverAddress;}public int getWeight() {return weight;}}
}
(三)关键步骤
- 初始化时传入包含服务器地址和权重的加权服务器列表,并创建随机数生成器。
- 首先计算所有服务器的总权重。
- 生成一个在总权重范围内的随机数。
- 遍历服务器列表,累加权重,当随机数小于当前累加权重时,选择对应的服务器并返回其地址。
(四)流程图
开始
|
|-- 初始化加权服务器列表和随机数生成器
| |
| |-- 接收请求
| | |
| | |-- 计算总权重
| | | |
| | | |-- 生成随机数
| | | |
| | | |-- 遍历服务器列表,累加权重
| | | | |
| | | | |-- 若随机数小于当前累加权重,选择服务器
| | | | |
| | | | |-- 返回服务器地址
结束
五、一致性哈希负载均衡器
(一)理论介绍
一致性哈希算法将服务器和请求都映射到一个固定范围的哈希环上。请求根据其哈希值在环上顺时针查找,选择第一个遇到的服务器。当服务器节点发生变化时,只有少量请求的分配会受到影响,具有较好的容错性和可扩展性,适用于缓存服务器的负载均衡等场景。
(二)Java 实现示例
import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;public class ConsistentHashLoadBalancer {private SortedMap<Integer, String> circle = new TreeMap<>();private int replicas;public ConsistentHashLoadBalancer(List<String> serverList, int replicas) {this.replicas = replicas;for (String server : serverList) {addServer(server);}}public void addServer(String server) {for (int i = 0; i < replicas; i++) {int hash = getHash(server + i);circle.put(hash, server);}}public void removeServer(String server) {for (int i = 0; i < replicas; i++) {int hash = getHash(server + i);circle.remove(hash);}}public String getServer(String request) {if (circle.isEmpty()) {return null;}int requestHash = getHash(request);if (!circle.containsKey(requestHash)) {// 找到大于请求哈希值的第一个服务器SortedMap<Integer, String> tailMap = circle.tailMap(requestHash);requestHash = tailMap.isEmpty()? circle.firstKey() : tailMap.firstKey();}return circle.get(requestHash);}private int getHash(String key) {// 简单的哈希函数示例,实际可使用更复杂的哈希算法return Math.abs(key.hashCode());}
}
(三)关键步骤
- 初始化时传入服务器列表和每个服务器的虚拟节点数(副本数)。
- 为每个服务器创建指定数量的虚拟节点,并将其哈希值和服务器地址映射到哈希环上。
- 当有请求时,计算请求的哈希值。
- 如果哈希环上存在该请求哈希值对应的服务器,则直接返回;否则,在哈希环上顺时针查找第一个大于请求哈希值的服务器并返回。
(四)流程图
开始
|
|-- 初始化服务器列表、副本数和哈希环
| |
| |-- 接收请求
| | |
| | |-- 计算请求哈希值
| | | |
| | | |-- 若哈希环存在对应服务器,返回服务器地址
| | | |
| | | |-- 否则,在哈希环上顺时针查找
| | | | |
| | | | |-- 返回找到的服务器地址
结束
六、自定义负载均衡器的应用场景与选择
- 轮询:适用于后端服务器性能相近且对请求分配公平性要求较高的场景,如简单的 Web 应用服务器集群。
- 随机:在一些对请求分配随机性有要求且服务器性能差异不大的情况下使用,可用于一些测试环境或简单的分布式系统原型。
- 加权随机:当后端服务器性能有明显差异时,如不同配置的数据库服务器或应用服务器,根据服务器的处理能力分配权重,能更好地利用服务器资源。
- 一致性哈希:特别适合于缓存服务器集群,当缓存服务器节点增减时,能最大限度地减少对缓存数据的影响,保证系统的稳定性和数据命中率。
在实际应用中,需要根据后端服务器的性能特点、业务需求、系统的可扩展性和容错性等因素综合考虑选择合适的负载均衡算法,甚至可以结合多种算法来构建更加灵活高效的负载均衡策略。
相关文章:
负载均衡最佳实践及自定义负载均衡器
文章目录 负载均衡最佳实践及自定义负载均衡器一、负载均衡概述二、轮询负载均衡器(一)理论介绍(二)Java 实现示例(三)关键步骤(四)流程图 三、随机负载均衡器(一&#x…...
大模型 LMDeploy 量化部署
1 模型部署 定义: 在软件工程中,部署通常指的是将开发完毕的软件投入使用的过程。在人工智能领域,模型部署是实现深度学习算法落地应用的关键步骤。简单来说,模型部署就是将训练好的深度学习模型在特定环境中运行的过程。 场景…...
算法设计5_分支限界法
分支限界法 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树,裁剪那些不能得到最优解的子树以提高搜索效率。 步骤: ① 定义解空间(对解编码); ② 确定解空间的树结构; ③ 按BFS等方式搜索: a.每个活…...
2025年人工智能专业可以考哪些证书呢?
人工智能是目前全球热门的专业领域之一,随着人工智能应用范围的不断扩大,越来越多的人开始关注人工智能相关证书的获取。那么,人工智能专业可以考什么证书呢?本文将为大家介绍人工智能相关证书的种类。 人工智能机器视觉应用工程师…...
仿真技术助力高尔夫球打破传统设计局限,实现球杆强大的功能
Altair近日宣布与业内领先的高尔夫装备制造商 Cleveland Golf 开展合作,以设计新款 HiBore XL 球杆。借助 Altair 先进的仿真与设计技术,Cleveland Golf 不断刷新高尔夫装备的行业标准,并在球杆产品设计方面实现突破。 Cleveland Golf 借助 A…...
微前端架构学习笔记
前言 之前遇到过一个需求,有两个项目分别由两个不同的部门负责,不同技术栈,不同代码仓库: A 项目是官网,负责展示产品亮点等信息,有多个入口可以进入 B 项目中的不同页面。B 项目是业务线,负责…...
DApp开发:从合约到系统快速上线解决方案
在区块链技术迅猛发展的今天,去中心化应用(DApp)作为区块链的一项重要应用,已经吸引了众多开发者和企业的关注。与传统应用程序不同,DApp依托于区块链的去中心化特点,实现了透明、安全、不可篡改等优势&…...
react 中 useState 中的 set 方法异步解决
使用 useEffect 监听状态的改变。 一、异步特性 在批量处理状态更新时,用以提高性能。 二、异步解决 使用useEffect来处理更新后的状态,useEffect钩子在组件渲染后执行,并且会在依赖项(第二个参数)发生变化时重新执…...
UAC2.0 speaker——带反馈端点的 USB speaker(16bit 单声道)
UAC2.0 speaker 系列文章 UAC2.0 speaker——单声道 USB speaker(16bit) UAC2.0 speaker——类特殊请求 UAC2.0 speaker——音量控制 UAC2.0 speaker——多采样率支持 UAC2.0 speaker——24/32bit 支持 UAC2.0 speaker——speaker 数据传输 UAC2.0 speaker——同时支持 16bi…...
docker的简单使用
文章目录 docker简介docker架构镜像和容器镜像有关的常用命令容器相关常用命令 docker简介 Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。 Docker可以让开方子打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到…...
Selenium:强大的 Web 自动化测试工具
Selenium:强大的 Web 自动化测试工具 在当今的软件开发和测试领域,自动化工具的重要性日益凸显。Selenium 就是一款备受欢迎的 Web 自动化测试工具,它为开发者和测试人员提供了强大的功能和便利。本文将详细介绍 Selenium 是什么,…...
设计模式 在PLM系统的应用场景介绍
通义灵码 设计模式在 PLM(产品生命周期管理)系统中扮演着重要的角色,可以帮助开发人员更好地组织代码、提高系统的可维护性和扩展性。以下是一些常见的设计模式及其在 PLM 系统中的应用场景: 1. 单例模式(Singleton …...
C#请求https提示未能为 SSL/TLS 安全通道建立信任关系
System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系 ,这个错误通常表明你的应用程序在尝试建立一个安全的 SSL/TLS 连接时遇到了问题。这通常是由于证书验证失败引起的。证书验证失败可能有几个原因: 证书不受信任&#…...
【人工智能】GaussDB数据库技术及应用
文章目录 前言一、数据库的基本概念及发展演进1、数据库概念DB2、数据库管理系统概念DBMS3、数据库与数据库管理系统的关系4、数据库的演进及发展5、数据模型的基本概念6、数据模型的要求和类型7、层次模型的基本概念8、网状模型的基本概念8、关系模型的基本概念9、非关系模型的…...
OpenAI12天 –第3天的实时更新,包括 ChatGPT、Sora、o1 等
OpenAI提前开启了假期,推出了为期 12 天的活动,名为“OpenAI 12 天”。在接下来的一周左右的每一天,OpenAI 都将发布现有产品的新更新以及新软件,包括备受期待的 Sora AI 视频生成器。 OpenAI 首席执行官 Sam Altman 表示&#x…...
删除Yocto中build-x9hp_ms_a12_vemmc_ap2/tmp/work/aarch64-sdrv-linux/package后再编译出错问题
前言: 在yocto编译中,一般会添加自己的package并编译打包到yocto里去。这个包里的内容有时候需要添加或者删除。但是我删除了文件,在编译完成烧录到板子上,里面还有自己删除的文件,于是就在yocto搜索哪个目录有该文件&…...
2024三掌柜赠书活动第三十五期:Redis 应用实例
目录 前言 Redis操作都会,却不知道怎么用? 关于《Redis 应用实例》 编辑推荐 内容简介 作者简介 图书目录 《Redis 应用实例》全书速览 拓展:Redis使用场景 实例1:缓存应用 场景描述 实现方法 具体代码示例 实例2&a…...
观察者模式的理解和实践
引言 在软件开发中,设计模式是开发者们为了解决常见的设计问题而总结出来的一系列最佳实践。观察者模式(Observer Pattern)是其中一种非常经典且使用率极高的设计模式。它主要用于定义对象之间的一对多关系,使得当一个对象的状态发…...
查看Windows系统上的Redis服务器是否设置了密码
查看 Redis 配置文件 1.找到 Redis 配置文件: 通常Redis配置文件名为 redis.windows.conf 或 redis.conf,它位于Redis安装目录中。 2.打开配置文件: 使用文本编辑器(如Notepad、VS Code等)打开该文件。 3.查找 re…...
认识Java中的异常(半成品)
1.异常的概念与体系结构 1.1在Java中,将程序执行过程中发生的不正常行为称为异常.比如 1.算数异常 public class Main1 {public static void main(String[] args){System.out.println(10/0);} } //异常信息为:Exception in thread "main" java.lang.ArithmeticExc…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析
1. 基本介绍 TPS3103K33DBVR 是 德州仪器(Texas Instruments, TI) 推出的一款 低功耗电压监控器(Supervisor IC),属于 电源管理芯片(PMIC) 类别,主要用于 系统复位和电压监测。 2. …...
LeetCode 2894.分类求和并作差
目录 题目: 题目描述: 题目链接: 思路: 思路一详解(遍历 判断): 思路二详解(数学规律/公式): 代码: Java思路一(遍历 判断&a…...
