常见的负载均衡思路

  1. 按顺序挑选:例如第一次选第一台,第二次选第二台,到末尾后再讲索引指向数组开头
  2. 加权轮询:给每个节点一个权重,从而使得每个节点被访问到的概率不同
  3. 随机挑选:每次都随机挑选,x=rand.Int(i)%n
  4. 哈希类算法:保证同一个客户端的请求始终访问同一个服务器节点

    洗牌算法的负载均衡

    设计一个和节点数目相同大小的数组,每次来请求时都对索引数组重新洗牌,然后取第一个元素作为服务节点,若请求失败则选择下一个节点重试。

    Fisher-Yates洗牌算法

    思路:每次随机挑选一个值,放在数组末尾,然后在n-1个元素中最随机挑选一个值,放在数组末尾。
    1. func shuffle(index []int){
    2. for i:=len(index);i>0;i--{
    3. lastIdx=i-1
    4. idx:=rand.Int(i) // 生成0-i的随机数
    5. index[i],index[lastIdx]=index[lastIdx],index[i]
    6. }
    7. }
    8. // 该函数在go中已内置
    9. func shuffle(n int){
    10. b:=rand.Perm(n) // 返回[0,n)的伪随机序列
    11. return b
    12. }