概念

路由、负载均衡、容错:

概述

切入点

汇总

dubbo默认提供以下均衡策略

算法特性备注
RandomLoadBalance加权随机默认算法,默认权重相同
RoundRobinLoadBalance加权轮询借鉴于 Nginx 的平滑加权轮询算法,默认权重相同,
LeastActiveLoadBalance最少活跃优先 + 加权随机背后是能者多劳的思想
ShortestResponseLoadBalance最短响应优先 + 加权随机更加关注响应速度
ConsistentHashLoadBalance一致性哈希确定的入参,确定的提供者,适用于有状态请求
AdaptiveLoadBalance自适应负载均衡随机选择两个节点后,选择二者中 load 最小的那个节点

自适应负载均衡

概述

负载指标

(1)cpuLoad×(meanLag+1)×(inflight+1)successRate×nodeWeight+1

1675265271198-5b045ced-8524-42a2-8b34-d7edbbd1f232

选择公平性分析

image-20240904224137876

从另一种角度出发,上述选择方法可以看作是Fisher-Yates shuffle洗牌算法的变种。传统的洗牌算法要求集合支持随机下标访问,并且需要交换选择元素与待选择区间最后一个元素位置

p2c策略针对只选择两个随机元素的场景进行特定性优化,第一次选择得到区间[0, n-1]内的随机数i后,并不会真正交换选择元素a[i]与待选择区间最后一个元素a[n-1]位置,而只是标记二者已经完成交换。第二次生成随机数时,由于已经假定完成交换,所以生成随机数的范围变为[0,n-2],得到随机数j

此时如果j<i,由于ij右侧,第一次是否真正交换a[i]与a[n-1]的位置并不会对a[j]产生影响。

image-20240905021103850

如果j>=ia[i]会对a[j]产生影响,a[i]占据一个下标,将可能导致重复选取,并且由于a[i]的存在导致a[n-2]不会被选择到,所以需要将j+=1,消除a[i]的影响。

image-20240905021114153

通过上述策略,不涉及元素位置交换,也不要求待选择集合需要支持随机下标访问。

一致性哈希负载均衡

概述

shc-3

哈希环构建

coh

加权一致性哈希

最少活跃请求负载均衡

(2)warmupWeight=weight×min(currTimestartTimewarmupCycle,1)

加权随机负载均衡器

image-20240905172359074

加权轮询负载均衡

普通加权轮询算法

平滑加权轮询算法

--->每次选择节点时,遍历全部节点更新当前权重curr+=weight,同时累加节点权重sumWeight+=weight;

--->选择当前权重curr最大的节点作为调用节点,被选择节点更新当前权重curr-=sumWeight

--->此时被选择节点当前权重变为负值,在下一轮选择时,其当前权重将减小,被选择概率也会减小,避免了调用过于集中与高权重节点的问题;

--->再经过足够的轮次后,当前权重curr将回答原始权重,完成一轮加权轮询。

curr+=weight后当前权重curr本轮胜者合计权重totalWeight选择节点curr-=totalWeight后当前权重curr
起始轮\\A(0), B(0), C(0)
A(3), B(2), C(1)A6A(-3), B(2), C(1)
A(0), B(4), C(2)B6A(0), B(-2), C(2)
A(3), B(0), C(3)A6A(-3), B(0), C(3)
A(0), B(2), C(4)C6A(0), B(2), C(-2)
A(3), B(4), C(-1)B6A(3), B(-2), C(-1)
A(6), B(0), C(0)A6A(0), B(0), C(0)
A(3), B(2), C(1)A6A(-3), B(2), C(1)

最短响应优先负载均衡

滑动窗口

加权随机选择