分享
  1. 首页
  2. 文章

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
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏