美国行情数据API的WebSocket接入:纳斯达克实时推送优化与故障恢复

美国市场的交易时段是北京时间22:30-05:00(冬令时),盘前盘后也有数据推送。纳斯达克的推送频率峰值每秒可达数百笔,对客户端的处理能力要求极高。

最初的问题是消息积压。推送速度超过处理速度,内存不断增长。解决方案是使用生产者-消费者模式,接收线程只入队,处理线程从队列消费。

python

复制代码
from queue import Queue
import threading

msg_queue = Queue(maxsize=10000)

def on_message(ws, msg):
    try:
        msg_queue.put_nowait(json.loads(msg))
    except:
        # 队列满时丢弃旧消息,保证最新数据
        pass

def worker():
    while True:
        msg = msg_queue.get()
        process(msg)

【数据API】jkidata.com | 文档中心 docs.jkidata.com

序列号处理在美国行情数据API中尤为重要。纳斯达克推送频率高,偶尔丢包。每条消息带seq字段,客户端需要检查连续性,发现跳跃时通过REST接口补数据。

python

复制代码
if msg['seq'] != last_seq + 1:
    if msg['seq'] > last_seq + 1:
        missing = fetch_backfill(last_seq + 1, msg['seq'] - 1)
        for m in missing:
            process(m)

故障恢复也是关键。网络波动导致断连后,需要自动重连并恢复订阅。重连后服务端不会记住之前的订阅列表,客户端需要重发订阅指令。

python

复制代码
def on_close(ws, *args):
    time.sleep(1)
    reconnect()
    # 重连后重新订阅
    ws.send(json.dumps({"action": "subscribe", "symbols": current_symbols}))

美国有多个交易日(马丁路德金日、总统日等)休市。用美国行情数据API的isOpen字段判断。

docs.jkidata.com上有美国行情数据API的完整接入指南,包含WebSocket配置和故障恢复方案。

【数据API】jkidata.com | 文档中心 docs.jkidata.com