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

在路由时,权重(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);
        }
    }
}

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

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值