路由策略
路由策略决定租户的呼出流量如何选择中继。
1. 路由策略结构
路由策略 (Routing Profile)
├── 路由规则 1 ──► 前缀匹配 → 中继选择 → 号码改写
├── 路由规则 2 ──► ...
└── 路由规则 N ──► ...
2. 创建路由策略
Wholesale → 路由策略 → 新建:
- 名称:如 “profile-default”
- 重试策略:失败后是否尝试下一个规则
- 最大失败重试次数:默认 3
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"
匹配逻辑:
- Trie 最长前缀匹配,找到所有命中规则
- 按优先级排序(数字小优先)
- 同优先级内按权重加权轮询
- 如果启用 LCR,同优先级按买价升序
- 呼叫失败则尝试下一个优先级
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. 热加载
修改路由策略后点击 “重新加载”:
- 导出到
routing_profiles.generated.toml - 重建内存路由 Trie
- 已有通话不受影响
6. 路由模拟器与诊断
路由模拟器(0.5+,Wholesale 控制台):输入主叫/被叫号码对,模拟器显示哪些路由规则命中、哪条 Trunk 胜出——不用打测试电话就能验证费率或路由变更。
路由诊断工具(Wholesale 控制台):
输入:租户 ID + 被叫号码
输出:
- 匹配的路由规则(前缀、优先级)
- 选中的中继
- 卖费率、买费率
- 号码改写结果
- 熔断器状态
用于排查路由不通或费率错误等问题。