golang实现权重轮询调度算法
Posted 张伯雨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang实现权重轮询调度算法相关的知识,希望对你有一定的参考价值。
package main
import (
"fmt"
"time"
)
var slaveDns = map[int]map[string]interface{}{
0: {"connectstring": "[email protected](172.16.0.164:3306)/shiqu_tools?charset=utf8", "weight": 2},
1: {"connectstring": "[email protected](172.16.0.165:3306)/shiqu_tools?charset=utf8", "weight": 4},
2: {"connectstring": "[email protected](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)
}
}
以上是关于golang实现权重轮询调度算法的主要内容,如果未能解决你的问题,请参考以下文章