bab42b1b53
Two audit rounds after WS rollback: lighten hub options snapshot, cache hub balances without extra fetch_balance, soft-poll single-flight, and document fixes in R1/R2 reports. Co-authored-by: Cursor <cursoragent@cursor.com>
2.7 KiB
2.7 KiB
审计修复报告 · WS 回滚与中控可用性(2026-08-11 · 第 1 轮)
背景
期权链接入 OKX WS 推送后,生产中控出现「期权数据不可用 / 子代理不可用」。按要求先回滚 WS 链路,再全量审计并修复。
回滚
| 提交 | 说明 |
|---|---|
a488e2f |
Revert fast-path(依赖 WS 热缓存) |
d592632 |
Revert OKX WS + SSE 推送整栈 |
恢复为 REST 拉链 + 前端约 15s soft-poll(commit 24bb853 行为),删除:
lib/exchange/okx_public_ws_lib.pylib/options/options_quote_live_lib.pytests/test_options_quote_live_lib.py
根因结论(非仅 WS)
| 级别 | 问题 | 证据 |
|---|---|---|
| Critical | Gate 关键位 RS 监控在后台线程高频 fetch_ohlcv,与 /api/hub/account 争用同一 ccxt 客户端,账户/子代理超时 |
日志 [key_rs_level_alert] BTC/USDT id=13;本机 5000/api/hub/account 25s 超时 |
| Critical | 中控期权快照对每仓拉 books 深度,易超 HUB_FLASK_TIMEOUT=10 |
build_display_option_positions → attach_close_preview → fetch_option_book_depth |
| High | Soft 拉链 3 次重试 + 无单飞,易与 SSE tick 叠打 OKX | options_panel.js loadChain |
| High | 中控账户接口每轮 force=True 绕过余额缓存 |
Gate/OKX/Binance _hub_account_bundle |
| Medium | Flask 超时错误只有 error 无 msg,前端易落默认文案 |
hub.py _fetch_flask_json |
| Medium | options 为 null 时前端当成「0 仓」而非不可用 |
app.js renderOptionsSectionBody |
WS 部署触发的全进程重启放大了 Gate 争用与快照超时,表现为「全不可用」;OKX 快照在轻负载下仍可 ok:true。
本轮修复
- Hub 期权快照关闭逐仓
close_preview/books(with_close_preview=False) - Hub 账户三所改为
get_exchange_capitals(force=False) - Gate ccxt 增加
timeout=8000ms;RS K 线 45s 缓存 - 期权 tickers 恢复 10s 短缓存(无 WS)
- 前端 soft 拉链:单飞 + soft 仅 1 次尝试;已有链不先清空表格
- Hub:超时补
msg;期权快照与 account/monitor 并行 gather - 中控 UI:capabilities 含 options 且 snapshot 缺失时显式「期权数据不可用」
测试建议
- 强刷中控监控区:OKX 期权资金/持仓应恢复;Gate 子代理 status 应在数秒内恢复
- 期权页「刷新链」不应长时间白屏;指数行显示约 15s 静默刷新
- Gate 关键位监控日志不应再每秒刷屏
fetch_ohlcv失败
残留风险(交第 2 轮)
- Gate 仍与监控共用单一 ccxt 客户端(未加全局锁)
- 中控 board 仍可能被最慢交易所拉长整轮等待
- Soft-poll 仍是 REST,非真·实时