3、分发路由策略:基于规则的静态路由、基于权重的动态路由、基于内容的智能路由、路由表设计与维护

各位好,今天我们聊一个报价系统里非常核心的模块——分发路由策略。

说白了,就是一条报价请求进来之后,系统怎么决定把它扔给谁处理。是走A供应商?还是走B渠道?还是根据客户等级自动匹配?

我在做第一个报价系统的时候,就吃过路由策略的亏。当时所有请求都走同一个通道,结果高峰期直接把一个供应商打挂了。嗯,从那以后,我再也不敢轻视路由策略的设计。

3.1 基于规则的静态路由

静态路由,是最简单、最直接的方式。规则写死,请求来了就匹配。

举个例子:

// 伪代码示例
if (request.source == "APP" && request.amount < 10000) {
    routeTo("供应商A");
} else if (request.source == "WEB" && request.region == "华东") {
    routeTo("供应商B");
} else {
    routeTo("默认供应商");
}

这种方式的优点很明显:

  • 性能高——没有计算开销,直接匹配
  • 可预测——同样的请求永远走同样的路
  • 调试简单——出问题了一看就懂

但缺点也很致命:

  • 不灵活——规则变了要改代码
  • 无法应对突发流量——某个供应商挂了,规则不会自动切换
我的建议:静态路由适合初期系统,或者对稳定性要求极高、不允许动态变化的场景。比如内部测试环境,我一般就用静态路由。

3.2 基于权重的动态路由

动态路由就聪明多了。它不写死,而是根据权重来分配流量。

你想想看,假设你有三个供应商:

供应商 权重 说明
供应商A 50 价格低,但响应慢
供应商B 30 价格适中,响应快
供应商C 20 价格高,但稳定

系统会按照 50:30:20 的比例分发请求。权重可以动态调整,比如发现A供应商响应变慢了,就把它的权重降下来。

// 权重路由核心逻辑
function routeByWeight(routes) {
    let totalWeight = routes.reduce((sum, r) => sum + r.weight, 0);
    let random = Math.random() * totalWeight;
    let cumulative = 0;
    
    for (let route of routes) {
        cumulative += route.weight;
        if (random < cumulative) {
            return route.target;
        }
    }
}
核心要点:权重路由不是简单的轮询,而是概率分发。短时间看可能不均匀,但长时间看会趋近于权重比例。

我在项目中遇到过一个问题:权重路由导致某个供应商瞬间收到大量请求。后来发现是随机数种子的问题。嗯,这里要注意,一定要用高质量的随机数生成器,别用简单的 rand()。

3.3 基于内容的智能路由

智能路由,说白了就是根据请求的内容来做决策。这是最灵活、也最复杂的方式。

常见的判断维度:

  • 客户等级——VIP客户走专线通道
  • 产品类型——保险产品走A渠道,贷款产品走B渠道
  • 金额区间——小额走自动化,大额走人工审核
  • 风险等级——高风险请求走风控通道

举个例子:

// 智能路由规则引擎
const rules = [
    { condition: (req) => req.vipLevel >= 3, target: "VIP通道" },
    { condition: (req) => req.amount > 100000, target: "人工审核" },
    { condition: (req) => req.productType === "保险", target: "保险专线" },
    { condition: () => true, target: "默认通道" }  // 兜底规则
];

function smartRoute(request) {
    for (let rule of rules) {
        if (rule.condition(request)) {
            return rule.target;
        }
    }
}
避坑指南:我曾经犯过一个错误——规则顺序搞反了。VIP客户先匹配到了金额规则,结果走了人工审核通道。记住:规则顺序就是优先级顺序,一定要把最特殊的规则放在最前面。

3.4 路由表设计与维护

路由表,是所有路由策略的「大脑」。设计得好,系统就稳;设计得烂,天天出问题。

我个人习惯把路由表设计成三层结构:

  1. 全局路由表——定义所有可用的路由目标
  2. 策略路由表——定义不同策略下的路由规则
  3. 动态路由表——实时更新的权重、状态信息

来看一个实际的路由表结构:

{
    "routes": {
        "supplier_a": {
            "name": "供应商A",
            "type": "API",
            "endpoint": "https://api.supplier-a.com/quote",
            "timeout": 5000,
            "weight": 50,
            "status": "active"
        },
        "supplier_b": {
            "name": "供应商B",
            "type": "API",
            "endpoint": "https://api.supplier-b.com/quote",
            "timeout": 3000,
            "weight": 30,
            "status": "active"
        }
    },
    "policies": {
        "default": ["supplier_a", "supplier_b"],
        "vip": ["supplier_a"],
        "high_risk": ["supplier_b"]
    }
}

路由表的维护有几个关键点:

  • 版本管理——每次修改都要记录版本号,方便回滚
  • 灰度发布——新路由规则先在小范围验证
  • 健康检查——定期检查每个路由目标是否可用
  • 熔断机制——某个目标连续失败,自动摘除
一个小技巧:我习惯在路由表里加一个「优先级」字段。当多个策略同时命中时,优先级高的策略生效。这样就不用纠结规则顺序了。

3.5 三种路由策略对比

特性 静态路由 动态路由 智能路由
灵活性
性能
维护成本
适用场景 初期系统、测试环境 流量分发、负载均衡 复杂业务、精细化运营

实际项目中,这三种策略往往是组合使用的。比如:先用静态路由做基础分流,再用动态路由做负载均衡,最后用智能路由做精细化调度。

嗯,路由策略这块,说白了就是「把合适的请求,送到合适的地方」。设计得好,系统就像流水线一样顺畅;设计得不好,那就是天天救火。

我个人建议:先从静态路由开始,逐步引入动态路由,最后再上智能路由。别一上来就想搞大而全,容易翻车。

分发路由策略核心架构图 报价请求入口 路由决策器 规则匹配 → 权重计算 → 内容分析 静态路由 规则写死,性能最高 动态路由 权重分配,灵活调整 智能路由 内容分析,精准匹配 路由表(全局 + 策略 + 动态) 版本管理 | 灰度发布 | 健康检查 | 熔断机制

最后说一句:路由策略没有银弹。适合你的业务场景的,才是最好的。别盲目追求高大上的智能路由,先把基础的路由表设计好,比什么都强。


公众号:蓝海资料掘金营,微信deep3321