在路由时,权重(Weight)和优先级(Priority)是两个不同的概念,它们在路由策略中起着不同的作用:
1、权重(Weight):
作用: 权重用于表示每个目标(或节点)被选择的概率。具有更高权重的目标被选择的可能性更大。
例子: 如果有三个目标,权重分别为3、2、1,那么选择目标1的概率为3/(3+2+1),选择目标2的概率为2/(3+2+1),选择目标3的概率为1/(3+2+1)。
2、优先级(Priority):
作用: 优先级用于确定在有多个路由规则时,哪些规则会首先被考虑。具有更高优先级的规则会被先考虑,然后再考虑具有较低优先级的规则。
例子: 如果有两个规则,一个优先级为10,另一个优先级为5,那么优先级为10的规则会在优先级为5的规则之前被考虑。
在一些路由策略中,这两个概念可能会结合使用。例如,可以先根据优先级排序规则,然后在每个优先级中根据权重选择目标。这样可以实现更精细的路由控制,兼顾了目标选择的概率和规则的执行顺序。
分别用于控制目标的选择概率和规则的执行顺序。
可以这么理解,优先极高的先判断,但是优先级高不代表权重大,为什么要这么设计就是因为,比如有的利益最大话,可以设置成优先级高低,但是有点优先级高,但是他的陈功率比较低,所以我们要保障尽量走成功率有保障的。
/**
* @author jiangleilei
* @time 2024-01-15 15:01:57
* @description TODO
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class RouteRule {
private String target;
private int weight;
private int priority;
public RouteRule(String target, int weight, int priority) {
this.target = target;
this.weight = weight;
this.priority = priority;
}
public String getTarget() {
return target;
}
public int getWeight() {
return weight;
}
public int getPriority() {
return priority;
}
}
class WeightedPriorityRouter {
private List<RouteRule> routeRules;
private Random random;
public WeightedPriorityRouter() {
this.routeRules = new ArrayList<>();
this.random = new Random();
}
public void addRouteRule(RouteRule rule) {
routeRules.add(rule);
}
public String route() {
// 按照优先级降序排序
routeRules.sort((r1, r2) -> Integer.compare(r2.getPriority(), r1.getPriority()));
// 根据权重随机选择一个目标
int totalWeight = routeRules.stream().mapToInt(RouteRule::getWeight).sum();
int randomWeight = random.nextInt(totalWeight) + 1;
//通过概率选择走哪个规则,只哟随机数小于0时才考虑。
for (RouteRule rule : routeRules) {
randomWeight -= rule.getWeight();
if (randomWeight <= 0) {
return rule.getTarget();
}
}
// 如果没有匹配到,返回默认目标或者抛出异常
return "default_target";
}
}
public class Main {
public static void main(String[] args) {
WeightedPriorityRouter router = new WeightedPriorityRouter();
router.addRouteRule(new RouteRule("target1", 3, 10));
router.addRouteRule(new RouteRule("target2", 2, 5));
router.addRouteRule(new RouteRule("target3", 5, 8));
// 模拟多次路由
for (int i = 0; i < 10; i++) {
String target = router.route();
System.out.println("Route to: " + target);
}
}
}
就是权重大的,被选中的概率一定多,但是优先考虑优先级高的。当优先级高的,没随机中,在从第二个优先级里面判断是否符合权重规则,一致遍历下去。