来自:掘金,作者:竹子爱熊猫
链接:https://juejin.cn/post/7116421978776404004
随机算法
随机算法的实现也非常简单,也就是当客户端请求到来时,每次都会从已配置的服务器列表中随机抽取一个节点处理。
实现如下:
// 随机策略类:随机抽取集群中的一个节点处理请求
public class Random {
// 随机数产生器,用于产生随机因子
static java.util.Random random = new java.util.Random();
public static String getServer(){
// 从已配置的服务器列表中,随机抽取一个节点处理请求
return Servers.SERVERS.get(random.nextInt(Servers.SERVERS.size()));
}
}
上述该算法的实现,非常明了,通过 java.util 包中自带的 Random 随机数产生器,从服务器列表中随机抽取一个节点处理请求,该算法的结果也不测试了,大家估计一眼就能看明白。
随机算法的优势:个人看来该算法单独使用的意义并不大,一般会配合下面要讲的权重策略协同使用。
随机算法的劣势:
无法合理的将请求均摊到每台服务器节点。
由于处理请求的目标服务器不明确,因此也无法满足需要记录状态的请求。
能够在一定程度上发挥出高配置的机器性能,但充满不确定因素。
权重算法
权重算法是建立在其他基础算法之上推出的一种概念,权重算法并不能单独配置,因为权重算法无法做到请求分发的调度,所以一般权重会配合其他基础算法结合使用。
如:轮询权重算法、随机权重算法等,这样可以让之前的两种基础调度算法更为“人性化”一些。
权重算法是指对于集群中的每个节点分配一个权重值,权重值越高,该节点被分发的请求数也会越多,反之同理。
这样做的好处十分明显,也就是能够充分考虑机器的硬件配置,从而分配不同权重值,做到“能者多劳”。
那如何实现呢,先来看看随机权重的实现:
public class Servers{
// 在之前是Servers类中再加入一个权重服务列表
public static Map<String, Integer> WEIGHT_SERVERS = new LinkedHashMap<>();
static {
// 配置集群的所有节点信息及权重值
WEIGHT_SERVERS.put("44.120.110.001:8080",17);
WEIGHT_SERVERS.put("44.120.110.002:8081",11);
WEIGHT_SERVERS.put("44.120.110.003:8082",30);
}
}
// 随机权重算法
public class Randomweight {
// 初始化随机数生产器
static java.util.Random random = new java.util.Random();
public static String getServer(){
// 计算总权重值
int weightTotal = 0;
for (Integer weight : Servers.WEIGHT_SERVERS.values()) {
weightTotal += weight;
}
// 从总权重的范围内随机生成一个索引
int index = random.nextInt(weightTotal);
System.out.println(index);
// 遍历整个权重集群的节点列表,选择节点处理请求
String targetServer = "";
for (String server : Servers.WEIGHT_SERVERS.keySet()) {
// 获取每个节点的权重值
Integer weight = Servers.WEIGHT_SERVERS.get(server);
// 如果权重值大于产生的随机数,则代表此次随机分配应该落入该节点
if (weight > index){
// 直接返回对应的节点去处理本次请求并终止循环
targetServer = server;
break;
}
// 如果当前节点的权重值小于随机索引,则用随机索引减去当前节点的权重值,
// 继续循环权重列表,与其他的权重值进行对比,
// 最终该请求总会落入到某个IP的权重值范围内
index = index - weight;
}
// 返回选中的目标节点
return targetServer;
}
public static void main(String[] args){
// 利用for循环模拟10个客户端请求测试
for (int i = 1; i <= 10; i++){
System.out.println("第"+ i + "个请求:" + getServer());
}
}
}
/********运行结果********/
第1个请求:44.120.110.003:8082
第2个请求:44.120.110.001:8080
第3个请求:44.120.110.003:8082
第4个请求:44.120.110.003:8082
第5个请求:44.120.110.003:8082
第6个请求:44.120.110.003:8082
第7个请求:44.120.110.003:8082
第8个请求:44.120.110.001:8080
第9个请求:44.120.110.001:8080
第10个请求:44.120.110.002:8081
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




