1.加权随机算法
例如 A ,B, C 权重为 5,3,2
然后生成区间[0,5),[5,8),[8,10],随机范围为0~10,权重越大则概率越大
2.加权轮询
例如 A ,B, C 权重为 5,3,2
则按照 A,,A,A,A,A,B,B,B,C,C轮询
- 缺点:同样存在慢的提供者累积请求的问题。
加权轮询过程过程中,如果某节点权重过大,会存在某段时间内调用过于集中的问题。 例如 ABC 三节点有如下权重:{A: 3, B: 2, C: 1} 那么按照最原始的轮询算法,调用过程将变成:A A A B B C
对此,Dubbo 借鉴 Nginx 的平滑加权轮询算法,对此做了优化,调用过程可抽象成下表:
轮前加和权重 | 本轮胜者 | 合计权重 | 轮后权重(胜者减去合计权重) |
起始轮 | \ | \ | A(0), B(0), C(0) |
A(3), B(2), C(1) | A | 6 | A(-3), B(2), C(1) |
A(0), B(4), C(2) | B | 6 | A(0), B(-2), C(2) |
A(3), B(0), C(3) | A | 6 | A(-3), B(0), C(3) |
A(0), B(2), C(4) | C | 6 | A(0), B(2), C(-2) |
A(3), B(4), C(-1) | B | 6 | A(3), B(-2), C(-1) |
A(6), B(0), C(0) | A | 6 | A(0), B(0), C(0) |
我们发现经过合计权重(3+2+1)轮次后,循环又回到了起点,整个过程中节点流量是平滑的,且哪怕在很短的时间周期内,概率都是按期望分布的。
如果用户有加权轮询的需求,可放心使用该算法
3.一致性hash
hash函数,hash环,顺时针最近,删除添加节点无需迁移,不均匀问题可用虚拟节点解决
4.最小活跃度
根据目标集群服务器,处理性能最高的权重越高,处理性能较低的,权重也交低
实现:根据请求处理的吞吐量--》发起一次请求开始,计数器+1,一次请求处理完成,计数器-1,在相同时间内,计数器越小吞吐量越高