浅谈分布式的负载均衡

一、常见的负载均衡思路
1.1、按顺序挑:
round robin式,例如上次选了第一台,那么这次就选第二台,下次第三台;如果到了最后一台,那么下次从第一台开始。
1.2、随机挑一个:
每次都随机挑,真随机伪随机均可。假设选择了第x台机器,那么x可被描述为rand.Intn()%n
1.3、根据某种权重挑选
对下游节点进行排序,选择权重最大/小那一个

实际场景下我们不可能无脑轮询或者无脑随机,如果对下游请求失败了,我们还需要某种机制来进行重试,如果纯粹的随机算法,存在一定可能性下次仍然随机到这次的问题节点。

二、基于洗牌算法的负载均衡

考虑到我们需要随机选取每次发送请求的节点,同时在遇到下游返回错误时换其他节点重试。所以我们设计一个大小和节点数组大小一致的索引数组,每次来请求,我们对数组进行洗牌,然后取第一个元素作为选中的服务节点,如果请求失败,那么选择下一个节点重试

var endpoints = []string{
   
    "100.69.62.1:3232",
    "100.69.62.32:3232",
    "100.69.62.42:3232",
    "100.69.62.81:3232",
    "100.69.62.11:3232",
    "100.69.62.113:3232",
    "100.69.62.101:3232",
}

// 重点在这个 shuffle
func shuffle(slice []int) {
   
    for i := 0; i < len(slice); i++ {
   
        a := rand.Intn(len(slice))
        b := rand.Intn(len(slice))
        slice[a], slice[b] = slice[b], slice[a]
    }
}

func apiRequest(params map[string]interface{
   }, ep string) error {
   
    fmt.Println("ep:", ep)
    return nil
}

func request(params map[string]interface{
   }) error {
   
    var indexes = []int{
   0, 1, 2, 3, 4, 5, 6}
    var err error
    shuffle(indexes)
    maxRetryTimes 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值