golang实现权重轮询调度算法

zhangboyu · · 2043 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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)
    	}
    }


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:zhangboyu

查看原文:golang实现权重轮询调度算法

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2043 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传