今天总结下之前看过的dubbo源码中RandomLoadBalance使用的算法!
一:每个服务的权重不同
算法分析:在该段代码中,通过获取提供者服务的权重,然后计算出总权重,通过总权重计算出offset,然后在减去每个服务的权重,如果发现小于0,则调用当前服务。
例:有3个服务 A,B,C 其中A的权重为1,B的权重为2,C的权重为3;
此时的invokers中的服务的顺序有6种情况,分别为ABC,BAC,ACB,CAB,BCA,CBA 此时的 totalWeight=1+2+3=6,此时offset=random.nextInt(totalWeight)=random.nextInt(6)=【0,1,2,3,4,5】
可以通过一个列表描述碰撞到A,B,C的情况
offset | offset | offset | offset | offset | offset | |
invokers | 0 | 1 | 2 | 3 | 4 | 5 |
ABC | A | B | B | C | C | C |
BAC | B | B | A | C | C | C |
ACB | A | C | C | C | B | B |
CAB | C | C | C | A | B | B |
BCA | B | B | C | C | C | A |
CBA | C | C | C | B | B | A |
当offset=0的时候,如果invokers=ABC 则调用的是A,因为0-1<0 ; 当offset=4的时候,会经过几个循环
①offset=4-1=3>0,此时offset=3,继续下一步
②offset=3-2=1>0,此时offset=1,继续下一步
③offset=1-3=-2<0,调用 此时调用C
则调用A的概率为 P(A)=6/(6*6)=1/6
则调用B的概率为 P(B)=12/(6*6)=1/3
则调用C的概率为 P(B)=18/(6*6)=1/2
二:每个服务的权重相同
invokers.get(random.nextInt(length))
length为服务的个数
通过java提供的随机数,随机调用