分享
golang实现权重轮询调度算法(Weighted Round-Robin Scheduling)
Lancerio · · 5208 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
最近在看golang连接mysql数据库的例子(Go-MySQL-Driver),但是想到连接数据库肯定会有连接多从库的需求,而且每个从库的权重也会不一样,参考<<权重轮询调度算法(Weighted Round-Robin Scheduling) >>这篇文章写了一个golang版本的权重轮询调度算法,请大家指教,不多说了直接上代码:
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次结果是:
[画像:6122A254-6586-473B-A741-7227782B3FB2.png]
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信5208 次点击
被以下专栏收入,发现更多相似内容
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
最近在看golang连接mysql数据库的例子(Go-MySQL-Driver),但是想到连接数据库肯定会有连接多从库的需求,而且每个从库的权重也会不一样,参考<<权重轮询调度算法(Weighted Round-Robin Scheduling) >>这篇文章写了一个golang版本的权重轮询调度算法,请大家指教,不多说了直接上代码:
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次结果是: