

Pull Request已成功合入, 合并人@tobking
(感谢 zhinengwu 的贡献)变更摘要
此 PR 主要解决两个实例故障场景下的问题:一是实例异常(如 Pod 删除、IP 释放导致 TCP 黑洞)时连接建立依赖内核 SYN 重试(约 63s),远超客户端超时,导致请求直接失败而非快速熔断降级;二是熔断恢复定时器到点后直接闭合熔断,若实例未恢复则请求再次落入黑洞。修改通过在 BaseRouter 中新增 _build_request_timeout() 收敛 TCP connect 阶段超时,在 _auto_recover 中引入探活驱动的恢复流程,以及在 CircuitBreakerManager 中新增探活失败的指数退避逻辑,使黑洞场景下请求快速失败、熔断及时跳闸、恢复前验证实例可达。
主要改动
- Router 层连接超时收敛:
BaseRouter新增_build_request_timeout()方法,读取exception_config.connect_timeout(默认 5s,>0 时生效)单独约束 TCP connect 阶段,读写/总超时保持不变;forward_stream_request及非流式转发路径均改用该方法构建httpx.Timeout,使黑洞地址的连接快速失败而非阻塞约 63s。 - Scheduler 层探活驱动的熔断恢复:
_auto_recover不再直接闭合熔断,而是先调用新增的_probe_instance()对实例业务端口执行 TCP connect 探活(2s 超时),仅在探活成功后才调用auto_recover闭合熔断,避免请求重新派发到不可达实例。 - 熔断域探活失败指数退避:
CircuitBreakerManager新增process_probe_failure()方法,探活失败时保持熔断打开,恢复超时按trip_count指数退避(30s 起、2 倍递增、封顶 300s),并返回新的超时值供_schedule_recovery重新调度。 - 探活实例不存在或无端点的防御处理:
_probe_instance()在实例不在可用池中或无端点时直接返回False,避免空端点或不存在实例导致的异常,同时process_probe_failure对非 OPEN 状态实例返回None作为安全防护。 - 新增单元测试覆盖:新增
test_base_router_request_timeout.py(验证connect_timeout > 0与<= 0两种行为)和test_scheduler_circuit_breaker_probe.py(覆盖探活成功/失败、指数退避、恢复调度、边界条件),并在test_circuit_breaker.py中新增process_probe_failure的退避与状态校验用例。


代码审查
Now let me write the closing summary.
审查总结
本批次审查了 6 个变更文件,逐一核查结果如下:
| 文件 | 审查结论 |
|---|---|
motor/coordinator/domain/circuit_breaker.py |
无问题 — process_probe_failure 指数退避逻辑正确,边界值封顶 300s |
motor/coordinator/router/strategies/base.py |
发现 1 个 P3 问题(非 httpx 客户端兼容性) |
motor/coordinator/scheduler/runtime/scheduler_server.py |
发现 1 个 P2 问题(business_port 类型未校验) |
tests/coordinator/domain/test_circuit_breaker.py |
无问题 |
tests/coordinator/router/test_base_router_request_timeout.py |
无问题 |
tests/coordinator/scheduler/test_scheduler_circuit_breaker_probe.py |
无问题 |
按优先级统计:
- P0: 0
- P1: 0
- P2: 1 —
_probe_instance中business_port可能为非整数类型,导致探活静默失败、熔断永不解锁 - P3: 1 —
_open_nonstream_response非 httpx 分支传递httpx.Timeout对象而非原始int,可能影响内部测试客户端
整体风险评估:低风险。 核心逻辑(connect 超时收敛、熔断解除前 TCP 探活、探活失败指数退避)设计合理,边界处理正确。两个发现问题均为边界/防御性编程问题,不影响生产主路径。建议在合入前确认 business_port 的运行时类型,并对非 httpx 客户端分支做兼容处理。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-Ascend/MindIE-Motor | ✅ 吕有辉, 王君 (2/2) | ✅ 吕有辉 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
qq_46749096, thanks for your pull request. All authors of the commits have signed the CLA. 👍


/lgtm


/approve

