go随聊-负载均衡[随机]

        在分布式系统中,负载均衡是非常重要的环节,通过负载均衡将请求派发到网络中的一个或多个节点上进行处理。通常来说,负载均衡分为硬件负载均衡及软件负载均衡。硬件负载均衡,顾名思义,在服务器节点之间安装专门的硬件进行负载均衡的工作,F5便为其中的佼佼者。软件负载均衡则是通过在服务器上安装的特定的负载均衡软件或是自带负载均衡模块完成对请求的分配派发。

随机算法

  • 随机,按权重设置随机概率。
  • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

GO实现

接口定义:

type LoadBalance interface {
    //选择一个后端Server
    //参数remove是需要排除选择的后端Server
    Select(remove []string) *tool.Server
    //更新可用Server列表
    UpdateServers(servers []*tool.Server)
}

后端Server定义:

type Server struct {
    //主机地址
    Host string
    //主机名		
    Name string		
    Weight int	
    //主机是否在线	
    Online bool		
}

算法实现:

type LoadBalanceRandom struct{
	servers []*tool.Server
}

func NewLoadBalanceRandom(servers []*tool.Server) *LoadBalanceRandom{
	new:=&LoadBalanceRandom{}
	new.UpdateServers(servers)
	return new
}

//系统运行过程中,后端可用Server会更新
func (this *LoadBalanceRandom) UpdateServers(servers []*tool.Server) {
	newServers:=make([]*tool.Server,0)
	for _,e:=range servers {
		if e.Online==true {
			newServers=append(newServers,e)
		}
	}
	this.servers=newServers
}

//选择一个后端Server
func (this *LoadBalanceRandom) Select(remove []string) *tool.Server {
	curServer:=this.servers
	if len(curServer)==0 {
		return nil
	}

	if len(remove) == 0 {
		id:= fastrand.Uint32n(uint32(len(curServer)))
		return curServer[id]
	}else{
		tmpServers:=make([]*tool.Server,0)
		for _,s:=range curServer {
			isFind:=false
			for _,v:=range remove {
				if s.Host==v {
					isFind=true
					break
				}
			}
			if isFind==false {
				tmpServers=append(tmpServers,s)
			}
		}
		if len(tmpServers)==0 {
			return nil
		}
		selected:= fastrand.Uint32n(uint32(len(tmpServers)))
		return tmpServers[selected]
	}
}

func (this *LoadBalanceRandom) String() string {
	return "Random"
}

测试:

//创建4个Server,随机选择100000次
func TestNewLoadBalanceRandom(t *testing.T) {
	count:=make([]int,4)
	servers:=make([]*tool.Server,0)
	servers=append(servers,&tool.Server{Host:"1",Weight:0,Online:true})
	servers=append(servers,&tool.Server{Host:"2",Weight:1,Online:true})
	servers=append(servers,&tool.Server{Host:"3",Weight:2,Online:true})
	servers=append(servers,&tool.Server{Host:"4",Weight:3,Online:true})
	lb:=NewLoadBalanceRandom(servers)

	for i:=0;i<100000;i++{
		c:=lb.Select(nil)
		count[c.Weight]++
	}
	fmt.Println(count)
}
------------------------------------------------------
[24906 24976 25138 24980]

能看到,分布还是比较平均

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值