路由时权重和优先级的区别

发布时间:2024年01月15日

在路由时,权重(Weight)和优先级(Priority)是两个不同的概念,它们在路由策略中起着不同的作用:

1、权重(Weight):

作用: 权重用于表示每个目标(或节点)被选择的概率。具有更高权重的目标被选择的可能性更大。
例子: 如果有三个目标,权重分别为321,那么选择目标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);
        }
    }
}

就是权重大的,被选中的概率一定多,但是优先考虑优先级高的。当优先级高的,没随机中,在从第二个优先级里面判断是否符合权重规则,一致遍历下去。

文章来源:https://blog.csdn.net/weixin_37862824/article/details/135602716
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。