重试与容错机制

📎 引用文件

本文引用的文件 - agent/backtest/loaders/base.py - agent/src/config/env_schema.py - agent/src/config/accessor.py - agent/tests/test_loader_retry_helpers.py - agent/tests/test_scheduled_research_executor.py - agent/tests/test_swarm_retry.py - agent/backtest/loaders/_http.py - agent/tests/test_ccxt_loader_bounded.py - agent/tests/test_okx_loader_bounded.py - agent/src/tools/alpha_bench_tool.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件系统性说明 Vibe-Trading 的重试与容错机制,覆盖预算限制的重试策略、指数退避算法、超时控制、瞬态异常分类、重试次数限制与失败处理逻辑;并记录环境变量配置选项、性能调优参数与监控日志。同时提供常见网络问题解决方案、API 限流处理与降级策略,以及重试机制的测试方法与性能基准测试指南。

项目结构

围绕重试与容错的关键代码集中在数据加载层与调度执行层: - 数据加载层(backtest/loaders):提供统一的“带预算的重试”工具函数,供各数据源 loader 复用。 - 调度执行层(scheduled research / swarm):实现任务级重试、指数退避与最大连续失败保护。 - 配置层(config):集中管理重试、超时、SSE 等运行时开关与环境变量解析。 - 测试层(tests):对重试行为、预算截断、缓存回退等进行严格回归验证。

graph TB A["调用方(Loader/工具)"] --> B["retry_with_budget<br/>带预算重试封装"] B --> C["check_budget<br/>墙钟预算检查"] B --> D["外部API/数据源"] E["调度器(Scheduled Research)"] --> F["指数退避+最大连续失败"] G["Swarm 重试(MCP)"] --> H["新建运行(不fork活跃运行)"] I["配置中心(env_schema)"] --> B I --> E I --> G

图表来源 - agent/backtest/loaders/base.py:127-236 - agent/src/config/env_schema.py:323-377 - agent/tests/test_scheduled_research_executor.py:369-416 - agent/tests/test_swarm_retry.py:1-42

章节来源 - agent/backtest/loaders/base.py:127-236 - agent/src/config/env_schema.py:323-377

核心组件

章节来源 - agent/backtest/loaders/base.py:127-236 - agent/backtest/loaders/base.py:243-439

架构总览

重试与容错贯穿“调用方—重试封装—外部依赖”的链路,并通过配置中心注入超时与退避策略。

sequenceDiagram participant Caller as "调用方" participant Retry as "retry_with_budget" participant Budget as "check_budget" participant API as "外部API/数据源" participant Cache as "本地缓存(可选)" Caller->>Retry : 传入fn, transient, deadline, label loop 最多 max_retries+1 次 alt 首次或重试 Retry->>Budget : 检查是否超过deadline Budget-->>Retry : 通过/抛出TimeoutError Retry->>API : 调用fn() alt 返回成功 API-->>Retry : 结果 Retry-->>Caller : 返回结果 else 捕获transient异常 Retry->>Retry : 计算剩余预算 alt 已达上限或预算耗尽 Retry-->>Caller : 抛出TimeoutError(含原异常) else 还有预算 Retry->>Retry : sleep(min(backoff[attempt], remaining)) end end end end Note over Caller,Cache : 若启用缓存且范围已结算,可直接命中缓存跳过网络

图表来源 - agent/backtest/loaders/base.py:184-236 - agent/backtest/loaders/base.py:163-179 - agent/backtest/loaders/base.py:243-439

详细组件分析

组件A:数据加载层重试封装(retry_with_budget / check_budget)

flowchart TD Start(["进入 retry_with_budget"]) --> CheckBackoff["校验 backoff 长度 >= max_retries"] CheckBackoff --> Loop{"尝试次数 i 从 0..max_retries"} Loop --> |i==0| CallFn["调用 fn()"] Loop --> |i>0| SleepWait["sleep(min(backoff[i-1], remaining))"] SleepWait --> CallFn CallFn --> Ok{"成功?"} Ok --> |是| Return["返回结果"] Ok --> |否| Transient{"是否为transient异常?"} Transient --> |否| Propagate["直接抛出异常"] Transient --> |是| BudgetCheck["remaining = deadline - now"] BudgetCheck --> Exhausted{"i==max_retries 或 remaining<=0 ?"} Exhausted --> |是| RaiseTO["抛出 TimeoutError(含__cause__)"] Exhausted --> |否| Wait["sleep(min(backoff[i], remaining))"] Wait --> Loop

图表来源 - agent/backtest/loaders/base.py:184-236

章节来源 - agent/backtest/loaders/base.py:127-236 - agent/tests/test_loader_retry_helpers.py:74-166

组件B:调度器重试(Scheduled Research)

sequenceDiagram participant Exec as "调度执行器" participant Store as "作业存储" Exec->>Store : 读取作业(next_run_at) Exec->>Exec : 判断是否到期 alt 到期 Exec->>Exec : dispatch(job) alt 成功 Exec->>Store : 更新last_run_at/next_run_at else 失败 Exec->>Exec : 计算下次重试时间(指数退避, capped) Exec->>Store : 更新consecutive_failures/next_run_at end else 未到 Exec-->>Exec : 等待至tick end

图表来源 - agent/tests/test_scheduled_research_executor.py:369-416 - agent/src/config/env_schema.py:354-362

章节来源 - agent/tests/test_scheduled_research_executor.py:369-416 - agent/src/config/env_schema.py:354-362

组件C:Swarm 重试(MCP retry_run)

章节来源 - agent/tests/test_swarm_retry.py:1-42

组件D:HTTP 层超时与重试配合

章节来源 - agent/backtest/loaders/_http.py:127-176 - agent/tests/test_ccxt_loader_bounded.py:111-144 - agent/tests/test_okx_loader_bounded.py:157-185

组件E:通用指数退避工具(Alpha Bench)

章节来源 - agent/src/tools/alpha_bench_tool.py:591-608

依赖关系分析

graph LR Base["loaders.base<br/>retry/check_budget"] --> Time["time.monotonic/sleep"] Base --> Log["logging"] Base --> DuckDB["duckdb(可选)"] Config["env_schema/accessor"] --> Base Tests["单元测试"] --> Base

图表来源 - agent/backtest/loaders/base.py:127-236 - agent/src/config/accessor.py:1-113 - agent/tests/test_loader_retry_helpers.py:44-48

章节来源 - agent/backtest/loaders/base.py:127-236 - agent/src/config/accessor.py:1-113

性能考量

故障排查指南

章节来源 - agent/backtest/loaders/base.py:163-236 - agent/tests/test_loader_retry_helpers.py:100-166 - agent/tests/test_scheduled_research_executor.py:369-416 - agent/tests/test_swarm_retry.py:35-42

结论

Vibe-Trading 的重试与容错体系以“预算+退避+超时”为核心,结合“瞬态异常分类”和“本地缓存降级”,在保证稳定性的同时兼顾性能与可观测性。调度层与 Swarm 层提供了任务级重试与恢复能力,配合配置中心的集中化管理,使系统在不同网络与上游条件下具备弹性与韧性。

附录

环境变量与配置选项(与重试/容错相关)

章节来源 - agent/src/config/env_schema.py:323-377 - agent/tests/test_ccxt_loader_bounded.py:111-144 - agent/tests/test_okx_loader_bounded.py:157-185

常见网络问题与解决方案

降级策略

测试方法与基准测试指南

章节来源 - agent/tests/test_loader_retry_helpers.py:74-166 - agent/tests/test_scheduled_research_executor.py:369-416