路由策略

路由策略决定租户的呼出流量如何选择中继。

1. 路由策略结构

路由策略 (Routing Profile)
 ├── 路由规则 1 ──► 前缀匹配 → 中继选择 → 号码改写
 ├── 路由规则 2 ──► ...
 └── 路由规则 N ──► ...

2. 创建路由策略

Wholesale → 路由策略 → 新建:

  • 名称:如 “profile-default”
  • 重试策略:失败后是否尝试下一个规则
  • 最大失败重试次数:默认 3
Wholesale 路由策略控制台

3. 路由规则配置

每条路由规则定义:

字段说明示例
匹配前缀被叫号码前缀86
SIP 中继目标中继carrier-a
优先级数字越小越优先10
权重同优先级的流量分配比例100
被叫 Strip去掉被叫前 N 位0
被叫 Prepend被叫前添加无
被叫正则正则替换无
主叫池轮询使用的主叫号码列表多主叫号码

3.1 单条规则多主叫/被叫模式(0.5+)

单条路由规则可携带多个主叫与被叫前缀——过去要拆成多条的规则(同一目的码的移动/固话拆分、同一客户的多个 CLI 池)现在一条即可。路由规则同时获得稳定的 id 列与确定性排序,同一输入在重载与多节点间评估结果始终一致。

3.2 优先级与权重

被叫号码: 861012345678

规则匹配:
├── 优先级 10, carrier-a, 权重 80  ← 匹配前缀 "86"
├── 优先级 10, carrier-b, 权重 20  ← 匹配前缀 "86"
└── 优先级 20, carrier-c, 权重 100 ← 匹配前缀 "8610"

匹配逻辑:

  1. Trie 最长前缀匹配,找到所有命中规则
  2. 按优先级排序(数字小优先)
  3. 同优先级内按权重加权轮询
  4. 如果启用 LCR,同优先级按买价升序
  5. 呼叫失败则尝试下一个优先级

3.3 RouteInvite 链(0.5+)

Wholesale 的 RouteInvite 节点与核心默认路由器链式衔接:没有命中的 wholesale profile(或租户未绑定 profile)时,呼叫回落到 RustPBX 标准路由,而不是直接失败。Wholesale 路由同样暴露给控制台的统一路由栈,可在一处按序查看 wholesale 与核心的贡献。

3.4 主叫号码池

配置多个主叫号码,系统轮询使用:

{
  "caller_pool": ["05711234567", "05711234568", "05711234569"]
}

用途:运营商要求主叫号码轮换或限制单号码并发时。

3.5 号码改写管道

呼叫经过多层号码改写:

原始号码
  → 租户级改写 (strip/prepend/regex)
    → 路由规则改写 (strip/prepend/regex)
      → 中继技术前缀 (tech_prefix)
        → 发送到运营商

4. 失败重试与故障转移

4.1 重试配置

参数说明默认值
max_failover最大故障转移次数3
retry_interval_ms重试间隔0
failure_codes触发重试的 SIP 状态码[486, 487, 503]

4.2 故障转移流程

carrier-a (优先级 10) ──► 503 失败
  └── carrier-b (优先级 10) ──► 超时
        └── carrier-c (优先级 20) ──► 成功 ✓

4.3 明确的拒绝原因(0.5+)

Trunk 拒绝呼叫时,CDR 与 API 会给出具体的拒绝原因(欠费、熔断打开、无匹配路由、运营商拒绝),而不再只是笼统的 403/486——利润分析不必再从状态码里猜。

5. 热加载

修改路由策略后点击 “重新加载”:

  1. 导出到 routing_profiles.generated.toml
  2. 重建内存路由 Trie
  3. 已有通话不受影响

6. 路由模拟器与诊断

路由模拟器(0.5+,Wholesale 控制台):输入主叫/被叫号码对,模拟器显示哪些路由规则命中、哪条 Trunk 胜出——不用打测试电话就能验证费率或路由变更。

路由诊断工具(Wholesale 控制台):

输入:租户 ID + 被叫号码

输出:

  • 匹配的路由规则(前缀、优先级)
  • 选中的中继
  • 卖费率、买费率
  • 号码改写结果
  • 熔断器状态

用于排查路由不通或费率错误等问题。