← 返回题目列表

Dubbo 有哪些负载均衡策略?

高频 中等 第 4 / 25 题 更新于 2026/07/28
RPCDubbo负载均衡一致性哈希

简化版

Dubbo 内置四种负载均衡策略:① Random(随机,默认)——按权重随机选一个提供者,调用量大时趋于均匀;② RoundRobin(加权轮询)——按权重依次轮流;③ LeastActive(最少活跃调用)——选当前正在处理请求数最少的提供者,让慢的机器少接请求,快的多接;④ ConsistentHash(一致性哈希)——相同参数的请求固定路由到同一提供者,适合有状态/缓存亲和的场景。默认 Random,可通过配置切换。这些负载均衡都基于 Dubbo SPI,可自定义扩展。

详细版

四种策略:

策略原理适用场景
Random(默认)按权重随机选择通用,调用量大时均匀
RoundRobin按权重轮流通用,请求分布均匀
LeastActive选活跃调用数最少的(响应快的多接)后端性能不均,自动”能者多劳”
ConsistentHash相同参数固定到同一提供者需要请求粘性/缓存亲和

配置方式:

@DubboReference(loadbalance = "leastactive")
private UserService userService;
// 或在 Provider 端 @DubboService(loadbalance = "random")

权重(weight):Random 和 RoundRobin 都支持权重,性能好的机器配高权重分更多请求;还支持预热(warmup)——服务刚启动时权重逐渐提升,避免冷启动被打满。

完整版教学

一、负载均衡在 Dubbo 里的位置

Consumer 从注册中心拿到某服务的多个 Provider 地址后,每次调用要选一个来发请求——这就是负载均衡要做的事:在多个可用提供者之间合理分配请求,让流量均衡、不让某台过载、同时兼顾性能和特殊需求(如粘性)。Dubbo 在**集群层(Cluster)**做负载均衡,内置四种策略,默认 Random。

二、Random:随机(默认)

Random(随机) 是 Dubbo 的默认策略:从提供者列表里按权重随机选一个。

  • 按权重:如果提供者配了不同权重(weight),随机时权重大的被选中概率更高。比如 A weight=100、B weight=50,则 A 被选中的概率是 B 的两倍。
  • 为什么默认用它:随机实现简单、无状态,且在调用量足够大时,随机会趋于均匀(大数定律)——长期看各提供者按权重比例分到请求。适合绝大多数通用场景。

缺点:单次随机可能不均,但海量调用下会均匀。

三、RoundRobin:加权轮询

RoundRobin(加权轮询):按权重依次轮流选择提供者。比如 A、B、C 依次轮,权重不同则按比例轮(权重高的轮到的次数多)。

  • 与 Random 的区别:轮询是确定性的(严格按顺序/比例),Random 是概率性的。轮询在请求量不大时也能保证均匀分布(不像随机需要大数定律)。
  • Dubbo 用的是平滑加权轮询算法,避免了简单加权轮询「同权重节点连续被选」的不平滑问题。

四、LeastActive:最少活跃调用(能者多劳)

LeastActive(最少活跃数) 是很有特色的策略:选当前「活跃调用数」最少的提供者

  • 活跃数:一个提供者当前正在处理、还没返回的请求数。Dubbo 为每个提供者维护一个活跃计数——请求开始时 +1,返回时 -1。
  • 原理:活跃数少,说明这个提供者处理得快(请求来了很快就处理完、活跃数降下来)或当前较闲;活跃数多,说明它处理慢或忙(请求积压、活跃数高)。选活跃数最少的,相当于让处理快的机器多接请求、处理慢的机器少接请求——自动实现「能者多劳」,适应后端性能不均的情况。
  • 比 Random/RoundRobin 更智能——它能动态感知提供者的实际处理能力,而不是静态地按预设权重分。

五、ConsistentHash:一致性哈希(请求粘性)

ConsistentHash(一致性哈希):根据请求的参数计算哈希,相同参数的请求总是路由到同一个提供者

  • 用途:需要请求粘性 / 缓存亲和的场景。比如某个提供者对某类数据做了本地缓存,希望同一个用户/同一个 key 的请求总落到同一台,以提高缓存命中率
  • 为什么用一致性哈希而非普通哈希:普通哈希 hash(key) % 提供者数,一旦提供者数量变化(增减机器),几乎所有 key 的映射都会变,大量请求路由飘移、缓存全部失效。一致性哈希用哈希环 + 虚拟节点,提供者增减时只影响一小部分 key 的路由,大部分请求仍落到原来的提供者,缓存命中率稳定。这和缓存/数据分片里的一致性哈希是同一个思想。

六、常见误区与追问

这道题面试时最容易丢分的地方,是把「Dubbo 负载均衡」答成一段泛泛的组件介绍。更稳的答法是先给结论,再沿着 远程调用链路 拆清楚流程,最后补上异常场景、数字边界和选型取舍。

回答层次要讲清的内容容易漏掉的边界
核心定义Dubbo 负载均衡在可用 Invoker 列表中选一个提供者,常见策略有 Random、RoundRobin、LeastActive、一致性哈希不要停在名词解释
流程机制Directory 得到 Invoker 列表 -> Router 过滤不匹配实例 -> LoadBalance 按策略选择节点 -> 发起远程调用 -> 根据结果更新活跃数等统计说明谁触发、谁存储、谁通知、谁兜底
工程取舍若权重为 100、200、300,随机权重期望流量比例约为 1:2:3RPC 让调用写法像本地方法,但失败语义、网络延迟和版本兼容必须按远程系统处理
Dubbo 负载均衡 面试拆解:
1. Directory 得到 Invoker 列表
2. Router 过滤不匹配实例
3. LoadBalance 按策略选择节点
4. 发起远程调用
5. 根据结果更新活跃数等统计

记忆钩子:先拆代理、序列化、传输、寻址、容错,再说明超时、重试、幂等这些工程边界;回答时一定要落到题目中的「Dubbo 负载均衡」,不要把相邻中间件的能力混着讲。

  • 误区:轮询一定最公平。 如果机器性能不同或慢节点积压,简单轮询可能把流量压到慢实例上。
  • 误区:随机策略不稳定所以不能用。 加权随机在请求量足够大时分布稳定,实现简单且是 Dubbo 常见默认选择。
  • 误区:一致性哈希只为均衡。 它更重要的价值是让相同参数落到同一节点,适合有本地缓存的场景。
  • 追问:LeastActive 解决什么问题? 优先选择活跃调用数少的实例,避免慢节点继续堆积请求。
  • 追问:权重可以做什么? 可按机器性能分配流量,也可在发布时逐步调高新版本权重。
  • 追问:负载均衡和路由有什么区别? 路由先过滤出候选集合,负载均衡再从候选中选一个。

七、加强记忆

Dubbo 四种负载均衡(默认 Random):① Random(随机)——按权重随机,调用量大时趋均匀,通用默认;② RoundRobin(加权轮询)——按权重平滑轮流,请求量小也均匀;③ LeastActive(最少活跃调用)——选当前正在处理请求数最少的提供者(活跃数低=处理快/闲),自动能者多劳,适应性能不均;④ ConsistentHash(一致性哈希)——相同参数固定路由到同一提供者,用于请求粘性/缓存亲和,靠哈希环+虚拟节点让提供者增减时只影响少量 key。都支持权重 + 预热(warmup),且基于 SPI 可自定义扩展。口诀:随机默认、轮询均匀、最少活跃能者多劳、一致性哈希保粘性