当前位置: 首页 > news >正文

负载均衡最佳实践及自定义负载均衡器

文章目录

  • 负载均衡最佳实践及自定义负载均衡器
    • 一、负载均衡概述
    • 二、轮询负载均衡器
      • (一)理论介绍
      • (二)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 应用服务器集群。
  • 随机:在一些对请求分配随机性有要求且服务器性能差异不大的情况下使用,可用于一些测试环境或简单的分布式系统原型。
  • 加权随机:当后端服务器性能有明显差异时,如不同配置的数据库服务器或应用服务器,根据服务器的处理能力分配权重,能更好地利用服务器资源。
  • 一致性哈希:特别适合于缓存服务器集群,当缓存服务器节点增减时,能最大限度地减少对缓存数据的影响,保证系统的稳定性和数据命中率。

在实际应用中,需要根据后端服务器的性能特点、业务需求、系统的可扩展性和容错性等因素综合考虑选择合适的负载均衡算法,甚至可以结合多种算法来构建更加灵活高效的负载均衡策略。

相关文章:

负载均衡最佳实践及自定义负载均衡器

文章目录 负载均衡最佳实践及自定义负载均衡器一、负载均衡概述二、轮询负载均衡器&#xff08;一&#xff09;理论介绍&#xff08;二&#xff09;Java 实现示例&#xff08;三&#xff09;关键步骤&#xff08;四&#xff09;流程图 三、随机负载均衡器&#xff08;一&#x…...

大模型 LMDeploy 量化部署

1 模型部署 定义&#xff1a; 在软件工程中&#xff0c;部署通常指的是将开发完毕的软件投入使用的过程。在人工智能领域&#xff0c;模型部署是实现深度学习算法落地应用的关键步骤。简单来说&#xff0c;模型部署就是将训练好的深度学习模型在特定环境中运行的过程。 场景…...

算法设计5_分支限界法

分支限界法 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树&#xff0c;裁剪那些不能得到最优解的子树以提高搜索效率。 步骤&#xff1a; ① 定义解空间(对解编码); ② 确定解空间的树结构&#xff1b; ③ 按BFS等方式搜索&#xff1a; a.每个活…...

2025年人工智能专业可以考哪些证书呢?

人工智能是目前全球热门的专业领域之一&#xff0c;随着人工智能应用范围的不断扩大&#xff0c;越来越多的人开始关注人工智能相关证书的获取。那么&#xff0c;人工智能专业可以考什么证书呢&#xff1f;本文将为大家介绍人工智能相关证书的种类。 人工智能机器视觉应用工程师…...

仿真技术助力高尔夫球打破传统设计局限,实现球杆强大的功能

Altair近日宣布与业内领先的高尔夫装备制造商 Cleveland Golf 开展合作&#xff0c;以设计新款 HiBore XL 球杆。借助 Altair 先进的仿真与设计技术&#xff0c;Cleveland Golf 不断刷新高尔夫装备的行业标准&#xff0c;并在球杆产品设计方面实现突破。 Cleveland Golf 借助 A…...

微前端架构学习笔记

前言 之前遇到过一个需求&#xff0c;有两个项目分别由两个不同的部门负责&#xff0c;不同技术栈&#xff0c;不同代码仓库&#xff1a; A 项目是官网&#xff0c;负责展示产品亮点等信息&#xff0c;有多个入口可以进入 B 项目中的不同页面。B 项目是业务线&#xff0c;负责…...

DApp开发:从合约到系统快速上线解决方案

在区块链技术迅猛发展的今天&#xff0c;去中心化应用&#xff08;DApp&#xff09;作为区块链的一项重要应用&#xff0c;已经吸引了众多开发者和企业的关注。与传统应用程序不同&#xff0c;DApp依托于区块链的去中心化特点&#xff0c;实现了透明、安全、不可篡改等优势&…...

react 中 useState 中的 set 方法异步解决

使用 useEffect 监听状态的改变。 一、异步特性 在批量处理状态更新时&#xff0c;用以提高性能。 二、异步解决 使用useEffect来处理更新后的状态&#xff0c;useEffect钩子在组件渲染后执行&#xff0c;并且会在依赖项&#xff08;第二个参数&#xff09;发生变化时重新执…...

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是一个开源的应用容器引擎&#xff0c;基于Go语言并遵从Apache2.0协议开源。 Docker可以让开方子打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到…...

Selenium:强大的 Web 自动化测试工具

Selenium&#xff1a;强大的 Web 自动化测试工具 在当今的软件开发和测试领域&#xff0c;自动化工具的重要性日益凸显。Selenium 就是一款备受欢迎的 Web 自动化测试工具&#xff0c;它为开发者和测试人员提供了强大的功能和便利。本文将详细介绍 Selenium 是什么&#xff0c…...

设计模式 在PLM系统的应用场景介绍

通义灵码 设计模式在 PLM&#xff08;产品生命周期管理&#xff09;系统中扮演着重要的角色&#xff0c;可以帮助开发人员更好地组织代码、提高系统的可维护性和扩展性。以下是一些常见的设计模式及其在 PLM 系统中的应用场景&#xff1a; 1. 单例模式&#xff08;Singleton …...

C#请求https提示未能为 SSL/TLS 安全通道建立信任关系

System.Net.WebException: 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系 &#xff0c;这个错误通常表明你的应用程序在尝试建立一个安全的 SSL/TLS 连接时遇到了问题。这通常是由于证书验证失败引起的。证书验证失败可能有几个原因&#xff1a; 证书不受信任&#…...

【人工智能】GaussDB数据库技术及应用

文章目录 前言一、数据库的基本概念及发展演进1、数据库概念DB2、数据库管理系统概念DBMS3、数据库与数据库管理系统的关系4、数据库的演进及发展5、数据模型的基本概念6、数据模型的要求和类型7、层次模型的基本概念8、网状模型的基本概念8、关系模型的基本概念9、非关系模型的…...

OpenAI12天 –第3天的实时更新,包括 ChatGPT、Sora、o1 等

OpenAI提前开启了假期&#xff0c;推出了为期 12 天的活动&#xff0c;名为“OpenAI 12 天”。在接下来的一周左右的每一天&#xff0c;OpenAI 都将发布现有产品的新更新以及新软件&#xff0c;包括备受期待的 Sora AI 视频生成器。 OpenAI 首席执行官 Sam Altman 表示&#x…...

删除Yocto中build-x9hp_ms_a12_vemmc_ap2/tmp/work/aarch64-sdrv-linux/package后再编译出错问题

前言&#xff1a; 在yocto编译中&#xff0c;一般会添加自己的package并编译打包到yocto里去。这个包里的内容有时候需要添加或者删除。但是我删除了文件&#xff0c;在编译完成烧录到板子上&#xff0c;里面还有自己删除的文件&#xff0c;于是就在yocto搜索哪个目录有该文件&…...

2024三掌柜赠书活动第三十五期:Redis 应用实例

目录 前言 Redis操作都会&#xff0c;却不知道怎么用&#xff1f; 关于《Redis 应用实例》 编辑推荐 内容简介 作者简介 图书目录 《Redis 应用实例》全书速览 拓展&#xff1a;Redis使用场景 实例1&#xff1a;缓存应用 场景描述 实现方法 具体代码示例 实例2&a…...

观察者模式的理解和实践

引言 在软件开发中&#xff0c;设计模式是开发者们为了解决常见的设计问题而总结出来的一系列最佳实践。观察者模式&#xff08;Observer Pattern&#xff09;是其中一种非常经典且使用率极高的设计模式。它主要用于定义对象之间的一对多关系&#xff0c;使得当一个对象的状态发…...

查看Windows系统上的Redis服务器是否设置了密码

查看 Redis 配置文件 1.找到 Redis 配置文件&#xff1a; 通常Redis配置文件名为 redis.windows.conf 或 redis.conf&#xff0c;它位于Redis安装目录中。 2.打开配置文件&#xff1a; 使用文本编辑器&#xff08;如Notepad、VS Code等&#xff09;打开该文件。 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…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...