美国市场的交易时段是北京时间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