权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本号

因为每台server的配置、安装的业务应用等不同。其处理能力会不一样。所以,我们依据server的不同处理能力,给每一个server分配不同的权值。使其可以接受对应权值数的服务请求。

2个java源文件,例如以下所看到的:

public interface IProduceStrategy {

    public int getPartitionIdForTopic();

}
public class WeightFactorProduceStrategy implements IProduceStrategy {
private int i = -1; //表示上一次选择的server
private int cw = 0; //表示当前调度的权值
private int gcd = 0; //当前全部权重的最大公约数 比方 2,4。8 的最大公约数为:2
private int maxWeight; private List<Integer> weights = null; //作用计算最大公约数
private PartitionWeightRRParameter weightRRParametersDns[] = null; /**
* 依照轮询调研权重配置,格式例如以下:partition1:weight,partition2:weight
* @param partConfig
*/
public WeightFactorProduceStrategy(String partConfig) {
validate(partConfig);
this.initWeigthParam(Tools.parseCsvMap(partConfig));
} private Pattern pattern = Pattern.compile("([\\d+\\:\\d+],?){1,}"); private void validate(String partConfig) {
if (partConfig.length() <= 0)
throw new InvalidPartitonConfigException("partition config is incorrect :" + partConfig);
else if (partConfig.equals(".") || partConfig.equals(".."))
throw new InvalidPartitonConfigException("partition config is incorrect :" + partConfig); Matcher matcher = pattern.matcher(partConfig);
if(matcher.find()) {
String rexStr = matcher.group();
if (!rexStr.equals(partConfig))
throw new InvalidPartitonConfigException("partition config is incorrect :" + partConfig);
} else {
throw new InvalidPartitonConfigException("partition config is incorrect :" + partConfig);
}
} /**
* 格式例如以下:partition1:weight,partition2:weight
* @param csvMap
*/
private void initWeigthParam(Map<String, String> csvMap) {
weightRRParametersDns = new PartitionWeightRRParameter[csvMap.size()];
int numPart = 0;
weights = new ArrayList<Integer>(csvMap.size());
Set<Map.Entry<String, String>> entrySet = csvMap.entrySet();
for(Iterator<Map.Entry<String, String>> its = entrySet.iterator(); its.hasNext(); ) {
Map.Entry<String, String> entry = its.next();
weights.add(Integer.valueOf(entry.getValue()));
weightRRParametersDns[numPart++] = new PartitionWeightRRParameter(Integer.valueOf(entry.getKey()), Integer.valueOf(entry.getValue()));
} gcd = getGcdByList(weights);
maxWeight = getMaxWeight();
} /**
* 计算最大公约数
* @param weight_m 权重数
* @param weight_n 权重数
* @return
*/
private int GCD(int weight_m,int weight_n)
{
int temp;
while(weight_n != 0){
if(weight_m < weight_n){
temp = weight_m;
weight_m = weight_n;
weight_n = temp;
}
temp = weight_m - weight_n;
weight_m = weight_n;
weight_n = temp;
}
return weight_m;
} /**
*
* @param weights 权重列表
* @param startIndex list索引值,起始位置。 * @param nextGcd 传入最大公约数
* @return
*/
private int getGcdByList(List<Integer> weights, int startIndex, int nextGcd) {
if ( weights.size() < 2) {
throw new IllegalArgumentException("At least a number of parameters for 2");
}
if (weights.size() == 2 && startIndex == 0) {
return this.GCD(weights.get(startIndex), weights.get(startIndex + 1));
} if (startIndex + 1 > weights.size() -1 )
return nextGcd;
int curGcd = nextGcd > 0 ? nextGcd : weights.get(startIndex);
int nextIndex = startIndex + 1;
nextGcd = GCD(curGcd, weights.get(startIndex + 1)); //0,1 return getGcdByList(weights, nextIndex, nextGcd);
} private int getGcdByList(List<Integer> weights) {
return this.getGcdByList(weights, 0, 0);
} private int getWeightDns() {
for ( ; ; ) {
i = (i + 1) % weightRRParametersDns.length;
if (i == 0) {
cw = cw - gcd; //表示当前调度的权值
if (cw <= 0) {
cw = maxWeight;
if (cw == 0) {
return 0;
}
}
} if (weightRRParametersDns[i].getWeight() >= cw ) {
return weightRRParametersDns[i].getPartition();
}
}
} private int getMaxWeight() {
int max = 0;
for (int i = 0; i< weightRRParametersDns.length;i++) {
if (weightRRParametersDns[i].getWeight() >= max) {
max = weightRRParametersDns[i].getWeight();
}
} return max;
} public int getPartitionIdForTopic() {
return this.getWeightDns();
} /**
* 分区权重參数类
*/
static class PartitionWeightRRParameter {
private int partition;
private int weight; public PartitionWeightRRParameter(int partition, int weight) {
this.partition = partition;
this.weight = weight;
} public int getPartition() {
return partition;
} public int getWeight() {
return weight;
}
} }

单元測试类:

public class WeightFactorProduceStrategyTest {

    @Test
public void testGetPartitionIdForTopic() throws Exception {
IProduceStrategy weightFcProStrategy = new WeightFactorProduceStrategy("0:5,1:15,2:20"); for (int i = 0; i < 40; i++) {
// weightFcProStrategy.getPartitionIdForTopic();
System.out.println(weightFcProStrategy.getPartitionIdForTopic());
}
}
}

測试结果例如以下:

2
2
1
2
1
2
1
0
2
2
1
2
1
2
1
0
2
2
1
2
1
2
1
0
2
2
1
2
1
2
1
0
2
2
1
2
1
2
1
0

权重轮询调度算法 java版本号的更多相关文章

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

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 与上一遍博客 http://www.cnblogs.com/hu ...

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

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3 之前两篇相关博文: 权重轮询调度算法(WeightedRound-RobinScheduling)-Ja ...

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

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 import java.math.BigInteger; import java.util.ArrayLi ...

  4. 权重轮询调度算法(WeightedRound-RobinScheduling)

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 这里主要参考这篇文章的实现: Nginx 负载均衡-加权轮询策略 ...

  5. 权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现

    在多台机器实现负载均衡的时候,存在调度分配的问题. 如果服务器的配置的处理能力都一致的话,平均轮询分配可以直接解决问题,然而有些时候机器的处理能力是不一致的. 假如有2台机器 A和B , A的处理能力 ...

  6. golang实现权重轮询调度算法

    package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface ...

  7. 通过 PowerShell 支持 Azure Traffic Manager 外部端点和权重轮询机制

    Jonathan TulianiAzure网络 - DNS和 Traffic Manager高级项目经理 在北美 TechEd 大会上,我们宣布了 Azure Traffic Manager将支持 ...

  8. loadbalance轮询算法 java实现

    /** * <html> * <body> * <P> Copyright JasonInternational</p> * <p> All ...

  9. php版权重轮询调度算法

    2013-09-25 <?php class WeightedRoundRobin { private static $_weightArray = array(); private stati ...

随机推荐

  1. 关于Jwt的一些思考

    在使用jwt的过程中发现了两个问题续期和退出的问题. 续期 因为jwt的token在签发之后是有过期时间的,所以就存在管理这个过期时间的问题.我看网上有提出解决方案的大致有下面几个 每次更新过期时间, ...

  2. python 模块一览

    一个模块可以对应一个文件 同一个模块,可以import多次,但只会被导入一次 模块的导入顺序 导入模块写在文件最上面 自己写的和内置的以及扩展的分开 顺序:内置,扩展,自己写的 按字母大小写排序 一行 ...

  3. 嵌入式表单字段中的内容可能被server更改以删除不安全的内容。是否要又一次载入您的页面以查看保存结果?

    嵌入式表单字段中的内容可能被server更改以删除不安全的内容.是否要又一次载入您的页面以查看保存结果?         近期有朋友问到,当他在SharePoint首页上进行编辑时.插入一段代码. 完 ...

  4. swift 给导航添加item,实现界面的跳转

    //给导航添加item         var rightItem = UIBarButtonItem(title: "First", style: UIBarButtonItem ...

  5. cocos2dx 几个精灵依照顺序播放动画解决方法

    我先描写叙述一下这个问题: 拿之前做的卡牌游戏来说.假设一方场上有3张牌,那么肯定要以一种顺序来播放攻击动画.我是以从左到右的方式. 我的解决方案是向每张牌都传递一个延时參数,然后在runAction ...

  6. 11.怎样自学Struts2之Struts2验证[视频]

    11.怎样自学Struts2之Struts2验证[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: http://pan. ...

  7. Java实现斐波那契数列Fibonacci

    import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { // TODO ...

  8. Func委托和Action委托

    http://stackoverflow.com/questions/4317479/func-vs-action-vs-predicate The difference between Func a ...

  9. React ----- 路由懒加载的几种实现方案

    传统的两种方式 1.import() 符合ECMAScript提议的import()语法,该提案与普通 import 语句或 require 函数的类似,但返回一个 Promise 对象.这意味着模块 ...

  10. 替换默认debug.keystore文件

    最近在开发过程中需要频繁的为测试的同事签名apk,感觉非常很麻烦,于是就想把Intellij或是Eclipse使用的默认debug.keystore文件替换成发布用(生产环境)的签名文件,这样就可以直 ...