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

来源: http://studygolang.com/articles/8924

时间: 2024-10-28 16:14:48

golang实现权重轮询调度算法的相关文章

权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现

1 import java.math.BigInteger; 2 import java.util.ArrayList; 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.Map.Entry; 7 8 /** 9 * 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 10 * @author huligong 1

权重轮询调度算法 java版本

权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本 由于每台服务器的配置.安装的业务应用等不同,其处理能力会不一样.所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求. 2个java源文件,如下所示: public interface IProduceStrategy { public int getPartitionIdForTopic(); } public class WeightFactorPr

权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现2

权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 与上一遍博客 http://www.cnblogs.com/huligong1234/p/3819979.html 中实现方式不同,这里主要参考这篇文章的实现: Nginx 负载均衡-加权轮询策略剖析 http://www.cnblogs.com/dyllove98/archive/2013/07/13/3188450.html,与上一遍中实现比起来,效果比较好

轮询算法

在多台机器实现负载均衡的时候,经常用到轮询调度算法(Round-Robin Scheduling). 轮询调度算法就是以循环的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器. 算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度. 1.算法流程:假设有一组服务器 S = {S0, S1, -, Sn-1} ,有相应的权重,变量i表示上次选择的服务器,权值cw初始化为0,i初始化为-1 ,当第一次的时候取权值取最大的那个服

Nginx的继续深入(日志轮询切割,重写,负载均衡等)

Nginx的访问日志轮询切割 通常什么情况Nginx会把所有的访问日志生成到一个制定的访问日志文件access.log里面,但时间一长,日志个头很大不利于日志的分析和处理. 有必要对Nginx日志进行按天或按小时进行切割,分成不同的文件保存. [[email protected] logs]#cat /server/script/cut_nginx_log.sh#!/bin/shDataformat = `date +%Y%m%d`Basedir = "/usr/local/nginx"

LVS负载均衡之IPVSADM命令说明与轮询解释

"1" IPVSADM常用参数说明:-A:在内核的虚拟服务器表中添加一条新的虚拟服务器记录-E:编辑内核虚拟服务器表中的一条虚拟服务器记录-D:删除内核虚拟服务器表中的一条虚拟服务器记录-C:清除内核虚拟服务器表中的所有记录-R:恢复虚拟服务器规则-S:保存虚拟服务器规则,输出为-R选项可读的格式-a:在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录-e:编辑一条虚拟服务器记录中的某条真实服务器记录-d:删除一条虚拟服务器记录中的某条真实服务器记录-L|-l:显示内核虚拟服务器

nginx反向代理负载均衡(轮询权重IPHash)

1 Nginx反向代理 1.1 实现图片回显 1.1.1 反向代理 说明:当用户发出image.jt.com/2018/1.jpg时,首先将请求发往Nginx.经过Nginx内部配置自动进行路径的切换.E:jt-upload/2018/1.jpg并且访问切换后的路径.将返回的结果再次返回给浏览器.这时浏览器可以进行正常的展现 1.1.2 Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是

golang+sse+angular的心跳机制、angullar的轮询机制、time.Duration和time.NewTicker的学习

长连接断开的原因 连接超时,浏览器自动断开连接 进程被杀死 不可抗拒因素 根据不同情况,高效保活的方式 连接超时:心跳机制 进程保活 断线重连 重点心跳机制 产物 心跳包 心跳应答 轮询与心跳区别 轮询一次相当于:建立一次TCP连接+断开连接 心跳:在已有的连接上进行保活 心跳设计要点 心跳包的规格(内容&大小) 心跳发送间隔时间(按照项目的特性进行判断) 断线重连机制(核心= 如何判断长连接的有效性) 心跳具体实现(基于sse的长连接) 客户端做心跳机制:客户端长时间没有反应,使用心跳机制,证

golang轮询机制select的理解

func main() { c := make(chan int) quit := make(chan int) go func() { for i := 0; i < 10; i++ { fmt.Println(<-c) } quit <- 0 }() fibonacci(c, quit) } //select的轮询机制 func fibonacci(c chan int, quit chan int) { x, y := 0, 1 for { select { // select轮询