
在做外汇行情相关的项目时我一直在调试 WebSocket 的连接稳定性。实时行情很容易受到网络波动影响如果心跳间隔没设好连接就会断开数据就不连续。经过一段时间的摸索我找到了一套比较稳妥的做法既保证数据不断线也不会让网络或服务端压力太大。我自己用一些外汇实时api在高峰订阅多个货币对时心跳间隔尤其关键。刚开始按默认设置连接偶尔会断开。慢慢调整后我发现一个合理区间可以大幅提升稳定性。心跳间隔选择原则WebSocket 心跳主要是告诉服务端“我还在”防止连接被断开。选择间隔时我会考虑几个方面网络情况网络波动较大时间隔过长容易断线。服务端要求多数外汇实时api都有推荐或要求的心跳频率。应用负载心跳太频繁尤其是订阅大量行情时会增加服务器压力。我实际经验里心跳间隔在 10~30秒 之间比较稳。低于10秒几乎没必要浪费带宽超过30秒如果网络短暂抖动很容易被服务端断开。心跳策略示例我通常会用一个简单策略控制心跳默认 15 秒发送一次心跳。如果检测到网络抖动或长时间未收到数据把间隔缩短到 10 秒保持连接活跃。数据恢复正常后再逐步恢复到 15 秒。动态调整比固定间隔稳定得多也不浪费带宽。间隔设置优点缺点5~10秒基本不会掉线服务器压力大浪费带宽10~30秒稳定兼顾带宽极差网络下偶尔断线30秒以上带宽压力低网络抖动容易掉线心跳的 Python 实现我在实际项目里写了一个简单示例定时发送心跳包保证连接不断线。以 AllTick API的外汇实时 WebSocket 为例import asyncio import websockets import json async def send_heartbeat(ws, interval15): while True: heartbeat_msg json.dumps({type: ping}) await ws.send(heartbeat_msg) await asyncio.sleep(interval) async def subscribe_forex(): url wss://api.alltick.co/realtime/forex # 以 AllTick API 为例 async with websockets.connect(url) as ws: # 启动心跳 asyncio.create_task(send_heartbeat(ws, interval15)) # 订阅货币对行情 subscribe_msg json.dumps({ action: subscribe, symbols: [EURUSD, USDJPY] }) await ws.send(subscribe_msg) while True: message await ws.recv() data json.loads(message) print(data) asyncio.run(subscribe_forex())代码核心思路很简单开启一个独立协程定时发送心跳同时接收行情数据。心跳间隔设 15 秒大部分网络环境下都很稳。其他注意点重连机制即便心跳稳定也要加自动重连逻辑防止网络抖动导致的数据中断。心跳失败次数限制连续 3~5 次发送失败可以先断开再重连避免触发服务端防护。心跳内容保持轻量大多数服务端只需要简单的 Ping 包没必要传太多数据。我自己跑了一段时间订阅多个货币对的实时行情连接稳定几乎不用盯日志。我的判断综合网络环境、服务端要求和实际经验WebSocket 心跳间隔 15 秒左右 对大部分外汇实时api来说最稳。可以根据网络情况在 10~20 秒之间微调核心是保持连接活跃同时不过度增加带宽和服务端压力。稳定的心跳让实时行情连接像加了保险不用总担心数据会断掉。对交易或行情分析系统来说这个细节比很多复杂逻辑更重要。