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实现权重轮询调度算法的主要内容,如果未能解决你的问题,请参考以下文章

轮询算法

LVS 模式

04-LVS集群调度算法

LVS的调度算法-个人理解

负载均衡算法 — 轮询

负载均衡算法的几种常用方案