fix(hub): restore pre-WS quote path and relieve Gate/account contention
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>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# 审计修复报告 · 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.py`
|
||||
- `lib/options/options_quote_live_lib.py`
|
||||
- `tests/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`。
|
||||
|
||||
## 本轮修复
|
||||
|
||||
1. **Hub 期权快照**关闭逐仓 `close_preview`/books(`with_close_preview=False`)
|
||||
2. **Hub 账户**三所改为 `get_exchange_capitals(force=False)`
|
||||
3. **Gate ccxt** 增加 `timeout=8000ms`;RS K 线 **45s 缓存**
|
||||
4. **期权 tickers** 恢复 **10s** 短缓存(无 WS)
|
||||
5. **前端 soft 拉链**:单飞 + soft 仅 1 次尝试;已有链不先清空表格
|
||||
6. **Hub**:超时补 `msg`;期权快照与 account/monitor **并行 gather**
|
||||
7. **中控 UI**:capabilities 含 options 且 snapshot 缺失时显式「期权数据不可用」
|
||||
|
||||
## 测试建议
|
||||
|
||||
- 强刷中控监控区:OKX 期权资金/持仓应恢复;Gate 子代理 status 应在数秒内恢复
|
||||
- 期权页「刷新链」不应长时间白屏;指数行显示约 15s 静默刷新
|
||||
- Gate 关键位监控日志不应再每秒刷屏 `fetch_ohlcv` 失败
|
||||
|
||||
## 残留风险(交第 2 轮)
|
||||
|
||||
- Gate 仍与监控共用单一 ccxt 客户端(未加全局锁)
|
||||
- 中控 board 仍可能被最慢交易所拉长整轮等待
|
||||
- Soft-poll 仍是 REST,非真·实时
|
||||
@@ -0,0 +1,41 @@
|
||||
# 审计修复报告 · WS 回滚与中控可用性(2026-08-11 · 第 2 轮)
|
||||
|
||||
## 范围
|
||||
|
||||
复查第 1 轮修复是否引入回归,并扫清仍会导致「中控不可用」的残留高优先级问题。
|
||||
|
||||
## 复查结论
|
||||
|
||||
| 项 | 结论 |
|
||||
|----|------|
|
||||
| Hub 并行 options 索引进位 | 正确(day / options 组合无错位) |
|
||||
| Hub 关闭 close_preview | UI 降级为 upl/`—`,不崩 |
|
||||
| Gate RS 缓存 / timeout | timeout 已为 int;缓存可接受 |
|
||||
| board row capabilities | `_fetch_agent_status` 始终带上 |
|
||||
| `with_close_preview` 默认 | 实例路径仍为 True |
|
||||
|
||||
## 本轮新发现问题与修复
|
||||
|
||||
| 级别 | 问题 | 修复 |
|
||||
|------|------|------|
|
||||
| High | Hub 账户在 `force=False` 后仍调用 `get_available_trading_usdt()` 再打一枪 `fetch_balance`,Gate 争用依旧 | 三所 `_hub_account_bundle` 改为用缓存的 `trading_usdt` 作为 `available_trading_usdt` |
|
||||
| Medium | `loadChain` soft 门禁在 `seq++` 之后,叠刷可导致 `chainLoadInFlight` 永不清理 | soft 门禁移到 `seq++` 之前 |
|
||||
|
||||
## 与第 1 轮一并交付的状态
|
||||
|
||||
- WS 推送链路已回滚(REST + 15s soft-poll)
|
||||
- 中控期权快照轻量化 + 并行拉取
|
||||
- Gate RS K 线短缓存 + ccxt timeout
|
||||
- 期权 tickers 10s 缓存;soft 单飞/单次尝试
|
||||
|
||||
## 已知残留(不阻塞本次部署)
|
||||
|
||||
- Gate 监控与账户仍共用单一 ccxt 客户端(无全局锁)
|
||||
- 中控 board 仍可能被最慢交易所拉长整轮
|
||||
- Soft-poll 非真·实时报价
|
||||
|
||||
## 部署后验收
|
||||
|
||||
1. 中控强刷:OKX 期权区有资金数字,不再长期「期权数据不可用」
|
||||
2. Gate 卡:子代理恢复绿色/有资金;不再长时间「子代理不可用」
|
||||
3. 期权页刷新链不白屏;约 15s 静默更新时间戳
|
||||
Reference in New Issue
Block a user