auto_trade_sys/docs/扫描结果缓存分析.md
薇薇安 c3a14f0f1a a
2026-01-25 16:53:40 +08:00

208 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 扫描结果缓存分析
## 问题描述
用户担心扫描结果缓存8个交易对在不同账户间共享可能导致账户B使用了账户A的过期缓存。
## 缓存层次分析
### 1. 可以共用的缓存(中间数据)
这些是**市场数据**,不依赖于账户配置,可以安全共用:
- **24小时行情数据缓存**`ticker_24h:all`
- TTL: 60秒
- 所有账户共用
- 这是市场原始数据,不依赖配置
- **K线数据缓存**`klines:{symbol}:{interval}:{limit}`
- TTL: 根据interval动态设置1h=60秒4h=300秒
- 所有账户共用
- 这是市场原始数据,不依赖配置
- **技术指标计算结果缓存**`indicators:{symbol}:{primary_interval}:{confirm_interval}`
- TTL: 30秒
- 所有账户共用
- 这是基于K线计算的不依赖配置
### 2. 扫描结果缓存(最终结果)
**缓存键**`scan_result:top_symbols:{ns}`
**TTL**30秒当前或15秒修改后
**问题分析**
#### 场景1同一账户自己再用30秒内
- **账户A在T0时刻扫描**缓存了8个交易对
- **账户A在T0+20秒再次扫描**,直接使用缓存
- **问题**
- 市场在变化30秒内价格可能已经变化
- 这8个交易对可能已经不适合了价格可能已经触发止损/止盈)
- 但是如果配置相同这8个交易对仍然是"当前市场最好的8个"
#### 场景2不同账户共用缓存
- **账户A在T0时刻扫描**缓存了8个交易对
- **账户B在T0+20秒扫描**直接使用账户A的缓存
- **问题**
- 如果账户A和账户B的配置不同这8个交易对可能不适合账户B
- 即使配置相同账户B也应该重新扫描因为市场在变化
## 结论
### 扫描结果缓存不应该共用
**理由**
1. **市场变化快**30秒内价格可能已经变化8个交易对可能已经不适合
2. **配置可能不同**:虽然现在使用全局配置,但未来可能不同账户有不同的配置
3. **扫描时间不同**:不同账户的扫描时间不同,不应该共用扫描结果
### 但是,中间数据可以共用
**理由**
1. **市场数据不依赖配置**24小时行情、K线数据、技术指标都是市场原始数据
2. **减少API请求**多个账户共用这些缓存可以显著减少API请求
3. **提升扫描效率**扫描250个交易对时如果每个账户都重新获取K线和计算技术指标会很慢
## 解决方案
### 方案1完全禁用扫描结果缓存推荐
**优点**
- 每个账户都重新扫描,确保使用最新的市场数据
- 避免使用过期交易对的风险
**缺点**
- 每个账户都需要重新扫描,耗时增加
- 但是由于中间数据K线、技术指标已经缓存重新扫描的耗时不会太长
### 方案2缩短TTL并加入account_id区分当前实现
**优点**
- 不同账户使用不同的缓存,避免配置不同的问题
- TTL缩短到15秒减少使用过期数据的风险
**缺点**
- 仍然存在使用过期数据的风险15秒内市场可能已经变化
- 增加了缓存键的复杂度
### 方案3在缓存键中加入配置哈希值
**优点**
- 如果配置不同,使用不同的缓存
- 如果配置相同,可以共用缓存
**缺点**
- 实现复杂
- 仍然存在使用过期数据的风险
## 推荐方案
**推荐方案1完全禁用扫描结果缓存****已实施**
**理由**
1. 扫描结果缓存的风险大于收益
2. 由于中间数据K线、技术指标已经缓存重新扫描的耗时不会太长约5-10秒
3. 确保每个账户都使用最新的市场数据
**实现**
- ✅ 移除扫描结果缓存逻辑
- ✅ 每个账户都重新扫描但使用缓存的中间数据K线、技术指标
## 性能影响
### 禁用扫描结果缓存后的性能
**扫描250个交易对**
- 获取24小时行情1次API请求缓存60秒多个账户共用
- 详细分析50-60个50-60次K线API请求有缓存多个账户共用
- 计算技术指标50-60次计算有缓存多个账户共用
- **总耗时**约15-40秒与之前相同因为中间数据已经缓存
**结论**:禁用扫描结果缓存后,性能影响很小,因为中间数据已经缓存。
---
## ✅ 已实施的优化2026-01-25
### 1. 禁用扫描结果缓存
**修改文件**`trading_system/market_scanner.py`
**变更**
- 移除了扫描结果缓存的读取逻辑
- 移除了扫描结果缓存的写入逻辑
- 每个账户都重新扫描,确保使用最新的市场数据
### 2. 优化多用户性能
**修改文件**`trading_system/market_scanner.py`
**变更**
- **降低并发数**从5个并发降低到3个并发确保多用户时系统稳定
- **添加超时控制**单个交易对分析超时10秒避免无限期阻塞
- **添加性能监控**记录扫描耗时如果超过60秒会发出警告
**效果**
- 即使有多个账户同时扫描,也不会对系统造成过大压力
- 扫描过程不会错过或耽误处理
- 通过日志可以监控扫描性能
### 3. 性能监控
**新增功能**
- 扫描完成后记录耗时
- 如果扫描耗时超过60秒会发出警告
- 方便监控多用户时的系统压力
---
## 📊 多用户场景下的性能保证
### 优化前
- 并发数5个
- 无超时控制
- 无性能监控
### 优化后
- 并发数3个降低系统压力
- 超时控制10秒避免阻塞
- 性能监控记录耗时超过60秒警告
### 预期效果
**单用户场景**
- 扫描耗时15-40秒
- 系统压力:低
**多用户场景4个账户**
- 扫描耗时15-40秒每个账户
- 系统压力中等由于中间数据缓存实际API请求不会大幅增加
- 不会错过或耽误处理:✅(超时控制确保不会无限期阻塞)
---
## 🚀 下一步操作
1. **重启交易进程**
```bash
supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 auto_sys_acc4
```
2. **验证优化**
```bash
# 查看日志,确认扫描结果缓存已禁用
tail -f /www/wwwroot/autosys_new/logs/trading_*.log | grep -E "开始扫描市场|扫描完成|扫描耗时"
# 监控扫描性能
tail -f /www/wwwroot/autosys_new/logs/trading_*.log | grep -E "扫描耗时|⚠️ 扫描耗时较长"
```
3. **观察效果**
- 观察扫描耗时是否在可接受范围内15-40秒
- 观察多用户时系统是否稳定
- 观察是否有超时警告