1、首先是Server
'''
Created on 2016年12月23日
@author: 玩代码的坏小孩
'''
class Server(object):
'''
classdocs
'''
def __init__(self, name,weight):
'''
Constructor
'''
self.name=name
self.weight=weight
self.visitCount=weight
2、主程序
#-*-coding:utf-8-*-
'''
Created on 2016年12月23日
@author: zhangkai
'''
import math
from com.hhdys.bean.Server import Server
class WeightRound(object):
'''
servers #全局变量 服务器列表
gcd #最大公约数
serversNum #服务器数量
'''
def __init__(self):
'''
Constructor
'''
self.curIndex=0
self.servers=list()
self.curServer=0
server1=Server("A",4)
server2=Server("B",4)
server3=Server("C",3)
self.servers.append(server1)
self.servers.append(server2)
self.servers.append(server3)
self.servers.append(Server("D",1))
self.getMaxGcd()
print(str.format("Max gcd is {0}",self.gcd))
self.getTotalWeight()
print(str.format("The total weight of the servsers is {0}",self.weightTotal))
def getMaxGcd(self):
'''
获取最大公约数
'''
tempGcd=0
for server in self.servers:
weight=server.weight
if tempGcd==0:
tempGcd=weight
continue
tempGcd=math.gcd(tempGcd, weight)
self.gcd=tempGcd
def getTotalWeight(self):
'''
总权值
'''
self.weightTotal=0
for server in self.servers:
self.weightTotal+=server.weight
self.weightTotal/=self.gcd
def getServer(self):
'''
获取服务器
'''
serversNum=len(self.servers)
if(self.curIndex>=self.weightTotal): #超过一次轮询
self.curIndex=0
self.curServer=0
for serverItem in self.servers:
print("reset visitCount========"+serverItem.name)
serverItem.visitCount=serverItem.weight
server=self.servers[self.curServer]
if self.curIndex<self.weightTotal and server.visitCount>0: #机器可用
server.visitCount-=self.gcd
print("Ther server is"+server.name)
self.curIndex+=1
self.curServer+=1
if self.curServer>=serversNum:
self.curServer=0
return server
while True:#机器已打权重上限 轮询下一台机器
self.curServer+=1
if self.curServer>=serversNum:
self.curServer=0
server=self.servers[self.curServer]
if self.curIndex<self.weightTotal and server.visitCount>0: #机器可用
server.visitCount-=self.gcd
print("Ther server is"+server.name)
self.curIndex+=1
self.curServer+=1
if self.curServer>=serversNum:
self.curServer=0
return server
if __name__=="__main__":
print("begin====")
wr=WeightRound()
for i in range(20):
wr.getServer()
print("end=====")
3、概述 3. 1. 首先每个服务器都配置有一个权重,求出所有服务器的权重和,作为一个轮询的周期。
3. 2. 然后求出所有权重的最大公约数,作为每一个服务器在每次请求的时候减去的步长。代码中visitCo代表这个服务器还能提供几个访问步长。 3. 3. 有一个计数器来标记当前请求的服务器,如果当前服务器可用(visitCount>0,此处未考虑服务器状态比如挂掉),并且计数器没有大于权重和,则返回此服务器。如果此服务器不可用,计数器+1,轮询下一个服务器,知道服务器可用,返回可用服务器。如果计数器大于权重和,表明一个轮询周期结束,重置计数器及每台机器可访问计数。