php 权重轮询,golang实现权重轮询调度算法(Weighted Round-Robin Scheduling)

最近在看golang连接mysql数据库的例子(Go-MySQL-Driver),但是想到连接数据库肯定会有连接多从库的需求,而且每个从库的权重也会不一样,参考<<

package main

import (

"fmt"

"time"

)

var slaveDns = map[int]map[string]interface{}{

0: {"connectstring": "root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8", "weight": 2},

1: {"connectstring": "root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8", "weight": 4},

2: {"connectstring": "root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8", "weight": 8},

}

var i int = -1 //表示上一次选择的服务器

var cw int = 0 //表示当前调度的权值

var gcd int = 2 //当前所有权重的最大公约数 比如 2,4,8 的最大公约数为:2

func getDns() string {

for {

i = (i + 1) % len(slaveDns)

if i == 0 {

cw = cw - gcd

if cw <= 0 {

cw = getMaxWeight()

if cw == 0 {

return ""

}

}

}

if weight, _ := slaveDns[i]["weight"].(int); weight >= cw {

return slaveDns[i]["connectstring"].(string)

}

}

}

func getMaxWeight() int {

max := 0

for _, v := range slaveDns {

if weight, _ := v["weight"].(int); weight >= max {

max = weight

}

}

return max

}

func main() {

note := map[string]int{}

s_time := time.Now().Unix()

for i := 0; i < 100; i++ {

s := getDns()

fmt.Println(s)

if note[s] != 0 {

note[s]++

} else {

note[s] = 1

}

}

e_time := time.Now().Unix()

fmt.Println("total time: ", e_time-s_time)

fmt.Println("--------------------------------------------------")

for k, v := range note {

fmt.Println(k, " ", v)

}

}

100次结果是:

e33f1374141687.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值