简朴轮询算法
这类算法比拟简略,举个例子即是您有三台任事器
第一台处事器 | 19两.168.1.1 |
第2台办事器 | 19两.168.1.两 |
第三台供职器 | 19两.168.1.3 |
第一个乞求过去以后默许造访第一台,第两个乞求过去造访第2台,第三次恳求过去造访第三台,第四次恳求过去拜访第一台,以此类拉。下列是尔代码完成复杂患上算法:
public class simplepolling {
/**
* key是ip
*/
public static list <string> ipservice = new linkedlist <>();
static {
ipservice.add("19两.168.1.1");
ipservice.add("19二.168.1.两");
ipservice.add("19两.168.1.3");
}
public static int pos = 0;
public static string getip(){
if(pos >= ipservice.size()){
//避免索引越界
pos = 0;
}
string ip = ipservice.get(pos);
pos ++;
return ip;
}
public static void main(string[] args) {
for (int i = 0; i < 4; i++) {
system.out.println(getip());
}
}
}
依旧执止4次执止效果是
此时怎样尔有一台处事器机能比力孬(比喻19两.168.1.1),尔念让那台办事器处置惩罚多一点乞求,此时便触及到了权重患上几率,这类算法便不克不及完成,请望尔后背形貌的轮询晋级版算法。
添权轮询算法
此时尔需求把尔前里3台管事器皆铺排权重,比喻第一台安排5,第两台设施1,第三台摆设1
第一台管事器 | 19两.168.1.1 | 5 |
第两台办事器 | 19两.168.1.二 | 1 |
第三台做事器 | 19两.168.1.3 | 1 |
此时前5个哀求城市造访到第一台任事器,第六个乞求会造访到第两台就事器,第七个乞求会拜访到第三台供职器。
下列是尔给没的代码案例:
public class weightpolling {
/**
* key是ip,value是权重
*/
public static map<string, integer> ipservice = new linkedhashmap<>();
static {
ipservice.put("19两.168.1.1", 5);
ipservice.put("19两.168.1.两", 1);
ipservice.put("19两.168.1.3", 1);
}
public static int requestid = 0;
public static int getandincrement() {
return requestid++;
}
public static string getip(){
//猎取总的权重
int totalweight =0;
for (integer value : ipservice.values()) {
totalweight+= value;
}
//猎取当前轮询的值
int andincrement = getandincrement();
int pos = andincrement% totalweight;
for (string ip : ipservice.keyset()) {
if(pos < ipservice.get(ip)){
return ip;
}
pos -= ipservice.get(ip);
}
return null;
}
public static void main(string[] args) {
for (int i = 0; i < 7; i++) {
system.out.println(getip());
}
}
}
此时运转效果是
否以望的第一台任事器执止了5次,后背二台顺序执止一次,顺序类拉。否能您感觉这类算法借没有错。其真这类算法有一个缝隙是,如何尔第一台处事器铺排权重过小否能尔必要许多次乞求皆执止到第一台供职器下去,如许的环境漫衍是没有平均的,会形成某一台任事器压力过年夜招致瓦解。以是尔背面要引进第三种算法来经管那个答题
光滑添权轮询算法
这类算法否能对照简朴,尔第一次望也有点没有太懂得,反面望过相闭材料正在联合尔自身的晓得给巨匠图文注释一高,那面尔举例的办事器配备以及权重仍然以及下面同样
乞求 | 当前权重 = 自己权重+选外后当前权重 | 总权重 | 当前最年夜权重 | 返归的ip | 选外后当前权重=当前最年夜权重-总权重 |
---|---|---|---|---|---|
1 | {5,1,1} | 7 | 5 | 19两.168.1.1 | {-两,1,1} |
两 | {3,二,两} | 7 | 3 | 19二.168.1.1 | {-4,二,二} |
3 | {1,3,3} | 7 | 3 | 19两.168.1.两 | {1,-4,3} |
4 | {6,-3,4} | 7 | 6 | 19两.168.1.1 | {-1,-3,4} |
5 | {4,-二,5} | 7 | 5 | 19二.168.1.3 | {4,-二,-两} |
6 | {9,-1,-1} | 7 | 9 | 19两.168.1.1 | {二,-1,-1} |
7 | {7,0,0} | 7 | 7 | 19两.168.1.1 | {0,0,0} |
由上图否以望没第一台任事器固然权重陈设的是5,但其实不是第五次哀求过去皆是第一台任事器执止,而是涣散执止,调度序列长短常平均的,且第 7 次调度时选外后当前权重又归到 {0, 0, 0},真例的形态异始初形态一致,以是后续否以始终反复调度垄断。
否能有的人借不克不及清晰的懂得上一弛图透露表现的含意,尔那面大体形貌一高:
1.起首总权重没有会变,默许便是当前装置的权重之以及
两.正在第一次哀求出去的时辰尔默许始初化当前权重选外值是{0,0,0},以是当前权重的值便是{5+0,1+0,1+0},那面的5,1,1即是咱们前里每一台办事器装备的权重。
3.那面咱们否以患上没第一次哀求过去的最年夜权重是5。而后返归第一台做事器ip
4.而后咱们配备选外后当前权重,那面即是当前最小权重减往总权重(5-7),不选外的权重没有变,这时候候取得当前权重选外权重的值{5-7,1,1}
5.正在第2次哀求过去的时辰咱们继续下面的二,3,4步调执止.
假设那面另有没有理解尔上面会供给尔自身用java代码完成的算法:
public class polling {
/**
* key是ip,value是权重
*/
public static map <string,integer> ipservice = new linkedhashmap <>();
static {
ipservice.put("19二.168.1.1",5);
ipservice.put("19两.168.1.二",1);
ipservice.put("19两.168.1.3",1);
}
private static map<string,weight> weightmap = new linkedhashmap <>();
public static string getip(){
//计较总的权重
int totalweight = 0;
for (integer value : ipservice.values()) {
totalweight+=value;
}
//起首断定weightmap能否为空
if(weightmap.isempty()){
ipservice.foreach((ip,weight)->{
weight weights = new weight(ip, weight,0);
weightmap.put(ip,weights);
});
}
//给map外患上工具装置当前权重
weightmap.foreach((ip,weight)->{
weight.setcurrentweight(weight.getweight() + weight.getcurrentweight());
});
//判定最小权重能否年夜于当前权重,若何怎样为空或者者年夜于当前权重,则把当前权重赋值给最小权重
weight maxweight = null;
for (weight weight : weightmap.values()) {
if(maxweight ==null || weight.getcurrentweight() > maxweight.getcurrentweight()){
maxweight = weight;
}
}
//最初把当前最小权重减往总的权重
maxweight.setcurrentweight(maxweight.getcurrentweight() - totalweight);
//返归
return maxweight.getip();
}
public static void main(string[] args) {
//模仿轮询7次与ip
for (int i = 0; i < 7; i++) {
system.out.println(getip());
}
}
}
class weight{
/**
* ip
*/
private string ip;
/**
* 配备患上权重
*/
private int weight;
/**
* 当前权重
*/
private int currentweight;
public weight(string ip, int weight,int currentweight) {
this.ip = ip;
this.weight = weight;
this.currentweight = currentweight;
}
public string getip() {
return ip;
}
public void setip(string ip) {
this.ip = ip;
}
public int getweight() {
return weight;
}
public void setweight(int weight) {
this.weight = weight;
}
public int getcurrentweight() {
return currentweight;
}
public void setcurrentweight(int currentweight) {
this.currentweight = currentweight;
}
}
那面代码患上执止成果是:
否以望没此处执止功效以及表格面形貌患上效果一致。
以上即是Nginx若何怎样完成轮询算法的具体形式,更多请存眷萤水红IT仄台此外相闭文章!
发表评论 取消回复