负载均衡算法

简介: 本文介绍五种负载均衡算法:随机、轮询、最小活跃数、源地址哈希与一致性哈希,涵盖适用场景及实现原理,并结合代码与图示解析其调度机制,适用于分布式系统流量分配设计参考。

随机

调用关系如上图(简化了公网->防火墙处理),适合场景:所有服务器性能基本一致,且无超阈值流量。

private K doSelect(List<K> nodes, String ip) {
    // 在列表中随机选取一个节点
    int index = random.nextInt(nodes.size());
    return nodes.get(index);
}

如果存在部分机器性能更优,此时可以在随机基础上增加权重,升级为:随机权重算法。

private K doSelect(List<K> nodes, String ip) {
    int length = nodes.size();
    AtomicInteger totalWeight = new AtomicInteger(0);
    for (K node : nodes) {
        Integer weight = node.getWeight();
        totalWeight.getAndAdd(weight);
    }
    if (totalWeight.get() > 0) {
        int offset = random.nextInt(totalWeight.get());
        for (N node : nodes) {
            // 让随机值 offset 减去当前node权重值
            offset -= node.getWeight();
            if (offset < 0) {
                // 当前node大于随机值offset,返回此Node
                return node;
            }
        }
    }
    // 随机返回
    return nodes.get(random.nextInt(length));
}

轮询

轮询不再是在多台服务器随机挑选,而是按照顺序一个个排队调用,调用完再插入队尾等待下一次调用

protected K doSelect(List<K> nodes, String ip) {
    int length = nodes.size();
    // 如果位置值已经等于长度重置为0(走一轮了)
    position.compareAndSet(length, 0);
    N node = nodes.get(position.get());
    // 数据原子增加,对应调用从1->2->3->4
    position.getAndIncrement();
    return node;
}

同加权随机,轮询也同样存在加权轮询的场景,此时流量调度将发生如下变化:

此处逻辑相对复杂,笔者在此说出主要思路,后续有时间补充伪代码,感兴趣的可以参照Dubbo的实现

如上有服务器servers=[A,B],对应权重weights=[3,1],总权重为4。我们可以理解为有4台服务器,3台A,1台B,一次调用过来的时候,需要按顺序访问。如有5次调用,调用顺序为AAABA。

选举思路如下:

次数

WeightedRoundRobin

选择结果

选择后的WeightedRoundRobin

1

3、1

A

2、1

2

2、1

A

1、1

3

1、1

A

0、1

4

0、1

B

0、0(等于0-0时复原成:3、1)

5

3、1

A

2、1

最小活跃数

指:将当前请求转发到连接数/请求数最少的机器上,其特点是根据服务器实时运行状态动态分配,保障服务负载不会过饱和。如下图当请求4过来时,Nginx判断目前服务器1连接数>服务器2,故4会请求到服务器2上:

源地址哈希

根据请求源IP哈希计算得到一个数值,用该数值在候选服务器列表的进行取模运算,得到的结果便是选中的服务器,此操作可以保证固定IP的请求总是到某一台服务器上,伪代码如下:

private K doSelect(List<K> nodes, String ip) {
    int length = nodes.size();
    int index = hash(ip) % length;
    return nodes.get(index);
}

一致性哈希

相同的请求尽可能落到同一个服务器上。一致性哈希解决稳定性问题,可以将所有的存储节点排列在首尾相接的 Hash 环上,每个 key 在计算 Hash 后会 顺时针找到临接的存储节点存放。而当有节点加入或退出时,仅影响该节点在 Hash环上顺时针相邻的后续节点。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
THW
|
28天前
|
人工智能 JSON API
免费的模型API平台盘点
本文盘点了当前可免费使用的大模型 API 平台,涵盖主流模型、调用限制与适用场景,助你低成本体验和集成各类 AI 能力。
THW
1903 5
|
18天前
|
云安全 人工智能 安全
阿里云2026云上安全健康体检正式开启
新年启程,来为云上环境做一次“深度体检”
1663 6
|
1月前
|
机器学习/深度学习 人工智能 算法
构建AI智能体:六十八、集成学习:从三个臭皮匠到AI集体智慧的深度解析
集成学习不是简单的"模型堆砌",而是有深刻理论支撑的系统性方法。理解其核心思想:集体智慧,多个不完美的个体可以组成一个强大的集体,误差分解,通过降低方差或偏差来提升性能,多样性驱动,模型间的差异是集成效果的关键,分层学习,从数据学习到学习如何学习。集成学习代表了机器学习中的一个重要哲学:通过协作和组合,我们可以创造出超越任何单个组件能力的系统。这正是"三个臭皮匠,顶个诸葛亮"在人工智能时代的具体实践。
285 108
|
27天前
|
SQL 容灾 数据库
分布式事务Seata
本章学习分布式事务问题及解决方案,涵盖CAP、BASE理论,并深入讲解Seata框架的XA、AT、TCC、SAGA四种模式原理与实现,掌握跨服务事务一致性处理及高可用部署。
 分布式事务Seata
|
28天前
|
缓存 前端开发 安全
什么是跨域?一文彻底搞懂 CORS 机制
本文深入解析Web开发中的跨域问题,涵盖同源策略、CORS原理、简单请求与预检请求机制,以及前后端配置方法,帮助开发者理解并解决常见的CORS错误,安全实现跨域资源共享。
|
27天前
|
JSON Java Shell
Jmeter快速入门
本文介绍JMeter的安装与快速入门使用方法,包括环境依赖、下载解压、启动运行、中文界面设置及基本测试计划创建,涵盖线程组配置、HTTP请求添加、监听器使用等性能测试核心操作步骤。
 Jmeter快速入门
|
27天前
|
机器学习/深度学习 传感器 人工智能
对抗样本攻击详解:如何让AI模型产生错误判断
对抗样本是通过微小扰动欺骗机器学习模型的输入,人眼难辨却致模型高置信度误判。其原理源于模型线性特性,如FGSM利用梯度符号生成扰动。此类攻击具迁移性,可跨模型生效,但亦可用于对抗训练,提升模型鲁棒性与泛化能力。
104 0
|
2月前
|
开发框架 JSON 前端开发
React 19 新特性全面解析:Actions、Server Components 与 useEffect 革命
React 19重磅升级:Actions简化异步处理,Server Components实现服务端零打包,useEffect优化心智模型。三大特性协同提升性能与开发体验,引领全栈新范式。
362 1
|
3月前
|
文字识别 测试技术 开发者
Qwen3-VL新成员 2B、32B来啦!更适合开发者体质
Qwen3-VL家族重磅推出2B与32B双版本,轻量高效与超强推理兼备,一模型通吃多模态与纯文本任务!
4238 12
|
5月前
|
存储 JavaScript 前端开发
详解C语言指针的指针,不信你还不懂!!!
指针的指针(也叫二级指针)是 C 语言中很经典但也让人迷惑的一个知识点。下面我帮你用最详细、最通俗的方式来讲清楚它,保证你看完会豁然开朗!