常见的负载均衡思路
- 按顺序挑选:例如第一次选第一台,第二次选第二台,到末尾后再讲索引指向数组开头
- 加权轮询:给每个节点一个权重,从而使得每个节点被访问到的概率不同
- 随机挑选:每次都随机挑选,x=rand.Int(i)%n
- 哈希类算法:保证同一个客户端的请求始终访问同一个服务器节点
洗牌算法的负载均衡
设计一个和节点数目相同大小的数组,每次来请求时都对索引数组重新洗牌,然后取第一个元素作为服务节点,若请求失败则选择下一个节点重试。Fisher-Yates洗牌算法
思路:每次随机挑选一个值,放在数组末尾,然后在n-1个元素中最随机挑选一个值,放在数组末尾。func shuffle(index []int){
for i:=len(index);i>0;i--{
lastIdx=i-1
idx:=rand.Int(i) // 生成0-i的随机数
index[i],index[lastIdx]=index[lastIdx],index[i]
}
}
// 该函数在go中已内置
func shuffle(n int){
b:=rand.Perm(n) // 返回[0,n)的伪随机序列
return b
}