负载均衡算法

简介: /

随机

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

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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
3月前
|
人工智能 开发框架 自然语言处理
Mule Agent Builder:面向下一代 Agent 的全新构建范式
MuleRun推出Mule Agent Builder,首创“Base Agent + Skills + Knowledge”范式,通过自然语言对话即可构建高能力、可推理、会调用工具的AI Agent。它大幅降低开发门槛,实现从创意到变现的一站式闭环,助力创作者轻松打造专属Agent并快速上架盈利。现诚邀共建者参与首批内测,共同定义下一代Agent的构建与商业化未来。
337 2
|
3月前
|
人工智能 JavaScript 小程序
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
|
12天前
|
人工智能 Linux API
2026年阿里云无影云电脑部署OpenClaw(Clawdbot)新手小白保姆级全教程
2026年,OpenClaw(曾用名Clawdbot、Moltbot)已经成为最流行的开源AI自动化智能体,支持自然语言执行任务、文件处理、流程自动化、多平台接入。但很多新手卡在本地环境复杂、依赖装不上、电脑性能不够、无法7×24小时运行等问题。
334 3
|
1月前
|
数据采集 数据挖掘 Python
Python3安装步骤详解(附环境变量配置与验证方法)
Python3是专为Windows设计的Python 3官方安装包,支持数据分析、爬虫、自动化等开发。安装时务必勾选“Add Python to PATH”,推荐以管理员身份运行。安装后通过cmd输入`python --version`验证,并可用IDLE或`.py`文件快速上手编程。(239字)
|
6月前
|
物联网 Java API
什么是智慧校园电子班牌系统?如何与学校现有系统对接?
智慧校园电子班牌系统是教育信息化的重要工具,集校园管理、家校互动、教学辅助于一体。它支持信息展示、智能考勤、家校留言、教学互动等功能,提升校园管理效率与教学质量。系统通过RESTful API、WebSocket等接口,与学校教务系统、一卡通、安防系统等无缝对接,实现数据实时同步与统一管理。模块化设计便于集成,保障信息互联互通,助力智慧校园建设。
425 6
|
2月前
|
存储 弹性计算 安全
2026年阿里云热门活动:云资源产品直降,38元轻量,99元ECS续费同价,组合套餐一键购买
2026年阿里云推出“云资源产品直降”活动,覆盖个人开发者至企业用户,提供38元轻量服务器、99元ECS固定配置及u2a实例2.5折等优惠。活动涵盖建站、测试、生产全场景,通过“组合GO”方案与免费试用降低技术门槛。核心产品包括ECS 99/199套餐、大模型服务平台组合及u2a实例,满足企业官网、数据分析等需求。新客户可领满减券,高校学生享300元无门槛金,实现成本极致优化。
268 3
|
7月前
|
Ubuntu Linux 网络安全
Ubuntu 16.04 LTS发布:新特性与全面支持
Canonical还发布了Ubuntu Server 16.04 LTS版本。该版本不仅包括LXD 2.0这一提供类似虚拟机体验的容器管理器,还集成了Docker 1.10、libvirt 1.3.1、QEMU 2.5、Open vSwitch 2.5.0以及Ceph Jewel 10.1.2 RC等众多组件。值得注意的是,Ubuntu Server 16.04 LTS还支持远程内核崩溃转储功能,通过SSH和NFS可轻松进行转储操作。此外,该版本还配备了最新的OpenStack发布Mitaka,由OpenStack Identity、OpenStack Imaging、OpenStack Bl
|
网络协议 算法 数据库
OSPF中的Stub区域详解
OSPF中的Stub区域详解
843 2
|
存储 SQL 安全
【绝密攻略】Flask应用如何抵御黑客入侵?七大安全技巧助你构建固若金汤的Web防线!
【8月更文挑战第31天】安全性是Web应用开发中的关键部分。Flask作为一款轻量级且高度可定制的框架,虽灵活但需开发者确保应用安全。本文介绍如何通过具体措施加固Flask应用,包括更新依赖项、启用CSRF保护、使用HTTPS、安全存储密码、防止SQL注入及清理用户输入等。通过示例代码展示如何在实际开发中应用这些策略,帮助提升应用安全性,为用户提供更可靠的服务。
677 0

热门文章

最新文章