负载均衡算法

简介: /

随机

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

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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
10月前
|
消息中间件 人工智能 NoSQL
|
10月前
|
人工智能 Java 网络安全
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
|
10月前
|
人工智能 JavaScript 小程序
|
数据采集 文字识别 JavaScript
视觉分析开发范例:Puppeteer截图+计算机视觉动态定位
本文介绍了在现代互联网中,传统DOM爬虫难以应对动态加载和视觉驱动内容的问题,并提出了“视觉爬虫”的解决方案。通过Puppeteer实现浏览器自动化,结合计算机视觉技术完成页面元素的动态定位与信息提取。文章对比了DOM爬虫与视觉爬虫的技术特点,展示了基于Node.js的核心代码示例,用于小红书平台的视频搜索、播放及截图处理。最后指出,视觉爬虫能够突破传统限制,在强JS渲染和动态内容场景中更具优势,为数据采集提供了新方向。
928 1
视觉分析开发范例:Puppeteer截图+计算机视觉动态定位
|
iOS开发 MacOS
Apple iWork (Pages、Numbers、Keynote) 14.4 - 文档、电子表格、演示文稿
Apple iWork (Pages、Numbers、Keynote) 14.4 - 文档、电子表格、演示文稿
492 1
Apple iWork (Pages、Numbers、Keynote) 14.4 - 文档、电子表格、演示文稿
|
人工智能 弹性计算 运维
通勤路上修故障?钉钉机器人+OOS AI助手实现7×24小时运维自由
通过钉钉机器人配置阿里云OOS AI助手,您可以直接在钉钉群内发送文字指令,实现免登录、跨设备、秒级响应的阿里云运维操作。
|
JavaScript 程序员 UED
如何快速搭建自己的个人网站?Hexo、VuePress 和 WordPress 大比拼!
晚枫和你聊聊程序员必备的个人网站!它是技术名片,能秀实力、记笔记、当博主、搞品牌。搭建工具有三种:Hexo简单快速,适合技术博客;VuePress功能丰富,可玩转动态交互;WordPress强大全面,适合复杂项目但维护成本高。根据需求选择工具,像选女朋友一样慎重哦!快来分享你的想法,一起探讨吧!记得点赞收藏不迷路~
760 17
|
边缘计算 人工智能 JavaScript
如何选择正确的体育电竞数据接口服务商?
想开发体育或电竞App却因数据接口问题头疼?数据延迟、更新慢、覆盖不全?本文教你挑选可靠的数据接口服务商,关注核心指标:实时性(&lt;0.5秒延迟)、准确性(错误率&lt;0.1%)、稳定性(99.99% SLA)。避坑指南助你远离劣质服务,优质接口应具备全链路解决方案、电竞专属优化及7x24技术支持。选对服务商,让数据为你的App赋能!

热门文章

最新文章