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

参考<<权重轮询调度算法(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": 8},
	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": 2},
}

var i int = -1  //表示上一次选择的服务器
var cw int = 0  //表示当前调度的权值
var gcd int = 2 //当前所有权重的最大公约数 比如 2,4,8 的最大公约数为:2
/*
算法思路:
cw为当前的权重,遍历每个服务器,如果服务器的权值大于cw,则该服务器执行一次,一轮轮询之后,cw-gcd;
之后重复上诉步骤
*/
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)
	}
}

执行结果:

C:/go/bin/go.exe build [D:/PROGRAM/Golang/src/study/roundRobin]
成功: 进程退出代码 0.
D:/PROGRAM/Golang/src/study/roundRobin/roundRobin.exe  [D:/PROGRAM/Golang/src/study/roundRobin]
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8
。。。(中间部分省略)
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8
total time:  0
--------------------------------------------------
root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8   58
root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8   28
root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8   14
成功: 进程退出代码 0.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值