WebSocket加密货币1分钟K线数据流存入本地数据库的架构设计疑问
架构方案建议
1. 写入方式与缓存选择
200个交易对的1分钟K线仅会每分钟产生200条结构化数据,单条数据大小通常不超过100字节,这个写入量级远低于MySQL的常规性能上限,直接写入数据库完全可以满足性能要求。
如果想要提升方案的鲁棒性,可以加一个轻量的本地内存队列做缓冲,不需要引入外置缓存组件:
- 缓冲的核心作用不是提升性能,而是避免异常场景丢数:比如数据库临时连接中断、websocket短时间断连重连补发数据时,不会阻塞websocket接收线程,也不会导致数据丢失
- 也可以攒数做批量提交,比如每攒50条或者每隔10秒批量写入一次MySQL,进一步降低数据库的IO压力,实现起来也非常简单
2. 技术栈选择
Python完全可以满足当前场景的需求,不需要更换技术栈:
- Python的websocket客户端、MySQL驱动生态都非常成熟,开发效率远高于其他语言,当前数据量级下性能没有任何瓶颈
- 只有当后续需要扩展到数千个以上交易对、接收秒级甚至更低粒度的数据流时,才需要考虑换成高性能语言,JS和Python在当前场景下的性能差异可以忽略,没有替换必要
- 不需要引入额外的第三方中间件,会徒增架构复杂度,当前轻量场景完全没必要过度设计
3. 方案合理性判断
这个方案非常合理:
- 用Websocket接收推送数据本身就是交易所实时数据的标准获取方式,对比轮询Rest API,既不会触发频率限制,数据延迟也更低,也能避免漏收K线的问题
- Python+MySQL的组合足够支撑你后续的历史数据查询、交易策略回测等需求,架构简单易维护
额外优化建议
- 给MySQL的K线表设置
交易对+K线开盘时间戳的联合主键,天然避免重复插入数据,重连补发数据时不需要额外做去重判断 - 增加简单的完整性校验逻辑:每分钟校验一次收到的K线数量是否和订阅的交易对数量匹配,如果出现缺漏,单次调用对应时间区间的Rest API补数即可,不会触发频率限制
内容的提问来源于stack exchange,提问作者Spino
相关产品推荐
相关产品推荐

