大厂微服务架构的负载均衡算法是如何选型的?

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 大厂微服务架构的负载均衡算法是如何选型的?

1 负载均衡的产生

假设你订阅了一个别人的服务,从注册中心查询得到了这个服务的可用节点列表,而这个列表里包含了几十个节点,这个时候你该选择哪个节点发起调用呢?这就是客户端负载均衡算法的问题。

2 负载均衡算法的意义

  • 考虑调用的均匀性,也就是要让每个节点都接收到调用,发挥所有节点的作用
  • 考虑调用的性能,也就是哪个节点响应最快,优先调用哪个节点

不同负载均衡算法也就是在这两个方面的考虑不同。

3 常见的负载均衡算法

random(随机)

dubbo默认。

image.png

从可用的服务节点中,随机挑选一个节点来访问。

实现时,随机算法通常通过生成一个随机数来实现,比如服务有10个节点,那么就每一次生成一个1~10之间的随机数,假设生成的是2,那么就访问编号为2的节点。

采用随机算法,在节点数量足够多,并且访问量比较大的情况下,各个节点被访问的概率基本相同。


适用场景

实现简单,在请求量远超可用服务节点数量的情况下,各个服务节点被访问的概率基本相同,主要应用在各个服务节点的性能差异不大时。

roundrobin(轮询)

均匀地将流量打到各个机器上去,但如果各个机器的性能不一样,容易导致性能差的机器负载过高。所以此时需要调整权重,让性能差的机器承载权重小一些,流量少一些。

按固定顺序,把可用的服务节点,挨个访问一次。

适用场景

类似随机算法,各个服务节点被访问的概率也基本相同,也主要应用在各个服务节点性能差异不大。

实现

通常把所有可用节点放到一个数组,挨个访问。比如服务有10个节点,放到数组里就是一个大小为10的数组,这样的话就可以从序号为0的节点开始访问,访问后序号自动加1,下一次就会访问序号为1的节点,以此类推。


轮询算法能保证所有节点被访问到的概率相同。一个轮询算法的代码实现,可以参考这个示例。

加权轮询

轮询能够保证所有节点被访问的概率相同,而加权轮询算法是在此基础上,给每个节点赋予一个权重,从而使每个节点被访问到的概率不同,权重大的节点被访问的概率就高,权重小的节点被访问的概率就小。

实现

加权轮询算法是生成一个节点序列,该序列里有n个节点,n是所有节点的权重之和。在这个序列中,每个节点出现的次数,就是它的权重值。比如有三个节点:a、b、c,权重分别是3、2、1,那么生成的序列就是{a、a、b、c、b、a},这样的话按照这个序列访问,前6次请求就会分别访问节点a三次,节点b两次,节点c一次。从第7个请求开始,又重新按照这个序列的顺序来访问节点。


要尽可能保证生产的序列的均匀,如果生成的不均匀会造成节点访问失衡,比如刚才的例子,如果生成的序列是{a、a、a、b、b、c},就会导致前3次访问的节点都是a。

适用场景

主要用在服务节点性能差异比较大的情况。比如新的服务节点的性能往往要高于旧的节点,这个时候可以给新的节点设置更高的权重,让它承担更多的请求,充分发挥新节点的性能优势。

leastactive(最少活跃连接)

自动感知一下,如果某个机器性能越差,那么接收的请求越少,越不活跃,此时就会给不活跃的性能差的机器更少的请求


每次访问都选择连接数最少的节点。因为不同节点处理请求的速度不同,使得同一个服务消费者同每一个节点的连接数都不相同。连接数大的节点,可以认为是处理请求慢,而连接数小的节点,可以认为是处理请求快。所以在挑选节点时,可以以连接数为依据,选择连接数最少的节点访问。


在实现时,需要记录跟每一个节点的连接数,这样在选择节点时,才能比较出连接数最小的节点。


适用场景

客户端同服务端节点的连接数是在时刻变化的,理论上连接数越少代表此时服务端节点越空闲,选择最空闲的节点发起请求,能获取更快的响应速度。

特别是当:

  • 服务端节点性能差异较大
  • 不好做到预先定义权重

采用该算法很不错。

consistanthash(一致性 hash)

一致性Hash算法,相同参数的请求一定分发到一个provider上去,provider挂掉的时候,会基于虚拟节点均匀分配剩余的流量,抖动不会太大。


通过某个hash函数,把同一个来源的请求都映射到同一个节点上。

同一个来源的请求,只会映射到同一个节点上,可以说是具有记忆功能,不会有分布式会话的困扰。只有当该节点不可用时,请求才会被分配到相邻的可用节点上。

适用场景

如果你需要的不是随机负载均衡,是要一类请求都到一个节点,那就走这个一致性hash策略。


因为它能够保证同一个客户端的请求始终访问同一个服务节点,所以适合服务端节点处理不同客户端请求差异较大的场景。比如服务端缓存里保存着客户端的请求结果,如果同一客户端一直访问一个服务节点,那么就可以一直从缓存中获取数据。

这五种负载均衡算法是业界最常用的,不光在RPC调用中被广泛采用,在一些负载均衡组件比如Nginx中也有应用,所以说是一种通用的负载均衡算法,但是不是所有的业务场景都能很好解决呢?

如果:

  • 服务节点数量众多,且性能差异比较大
  • 服务节点列表经常发生变化,增加节点或者减少节点时有发生
  • 客户端和服务节点之间的网络情况比较复杂,有些在一个数据中心,有些不在一个数据中心需要跨网访问,而且网络经常延迟或者抖动

这时:

  • 随机、轮询,第一个情况就不满足
  • 加权需要预先配置服务节点的权重,在节点列表经常变化的情况下不好维护,所以也不适合
  • 最少活跃连接算法是从客户端自身维度去判断的,在实际应用时,并不能直接反映出服务节点的请求量大小,尤其是在网络情况比较复杂的情况下,并不能做到动态的把请求发送给最合适的服务节点
  • 一致性hash显然也不适合这种场景


针对上面这种场景,有一种算法更加适合,这种算法就是

自适应最优选择算法

在客户端本地维护一份同每一个服务节点的性能统计快照,每隔一段时间更新该快照。

发起请求时,根据“二八原则”,把服务节点分成两部分,找出20%响应最慢的节点,降低权重。这样客户端就能够实时的根据自身访问每个节点性能的快慢,动态调整访问最慢的那些节点的权重,来减少访问量,从而可以优化长尾请求。


自适应最优选择算法是对加权轮询算法的改良,可以看作是一种动态加权轮询算法:


每隔一段时间获取客户端同每个服务节点之间调用的平均性能统计

需要在内存中开辟一块空间记录客户端同每一个服务节点之间调用的平均性能,并每隔一段固定时间去更新。这个更新的时间间隔不能太短,太短的话很容易受瞬时的性能抖动影响,导致统计变化太快,没有参考性;同时也不能太长,太长的话时效性就会大打折扣,效果不佳。根据我的经验,1分钟的更新时间间隔是个比较合适的值。


按这个性能统计对服务节点进行排序,对排在性能倒数20%的那部分节点赋予一个较低的权重,其余的节点赋予正常的权重

关键是设定权重值,即使服务节点之间的性能差异较大,也不适合把权重设置得差异太大,可能导致性能较好的节点与性能较差的节点之间调用量相差太大,这样也不是一种合理的状态。在实际设定时,可以设置20%性能较差的节点权重为3,其余节点权重为5。


这些都属于软件层面的负载均衡算法。

集群容错策略

failover cluster模式

默认,失败自动切换,自动重试其他机器,常用于读操作

failfast cluster模式

一次调用失败就立即失败,常用于写操作

failsafe cluster模式

发生异常时忽略掉,常用于不重要的接口调用,如记录日志

failbackc cluster模式

失败了后台自动记录请求,然后定时重发,适于写消息队列

forking cluster

并行调用多个provider,只要一个成功就立即返回

broadcacst cluster

逐个调用所有的provider

动态代理策略

默认使用javassist动态字节码生成,创建代理类

但是可以通过spi扩展机制配置自己的动态代理策略


参考

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
5月前
|
弹性计算 负载均衡 网络协议
阿里云SLB深度解析:从流量分发到架构优化的技术实践
本文深入探讨了阿里云负载均衡服务(SLB)的核心技术与应用场景,从流量分配到架构创新全面解析其价值。SLB不仅是简单的流量分发工具,更是支撑高并发、保障系统稳定性的智能中枢。文章涵盖四层与七层负载均衡原理、弹性伸缩引擎、智能DNS解析等核心技术,并结合电商大促、微服务灰度发布等实战场景提供实施指南。同时,针对性能调优与安全防护,分享连接复用优化、DDoS防御及零信任架构集成的实践经验,助力企业构建面向未来的弹性架构。
483 76
|
5月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
5月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
339 12
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
215 6
|
8月前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
1834 11
架构学习:7种负载均衡算法策略
|
7月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
112 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
8月前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
2399 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
8月前
|
人工智能 安全 Java
微服务引擎 MSE:打造通用的企业级微服务架构
微服务引擎MSE致力于打造通用的企业级微服务架构,涵盖四大核心内容:微服务技术趋势与挑战、MSE应对方案、拥抱开源及最佳实践。MSE通过流量入口、内部流量管理、服务治理等模块,提供高可用、跨语言支持和性能优化。此外,MSE坚持开放,推动云原生与AI融合,助力企业实现无缝迁移和高效运维。
315 1