409 字
2 分钟
WebSockets 硬核指南:实时通信的幕后推手
为什么要用 WebSocket?
在 WebSocket 出现之前,如果你想做一个股票行情页面,你只能用 AJAX 轮询 (Polling)。 浏览器:即使没有新数据,我也每秒问服务器一次:“有新价格吗?” 服务器:“没有。” 浏览器:“有新价格吗?” 服务器:“没有。” … 这就像一个焦虑的男盆友,效率极低,还浪费带宽。
WebSocket 是全双工的。 连接一旦建立,就像拉了一根专线。 服务器:“哥们,BTC 跌了!” -> 浏览器。 不需要问,直接推。
握手协议 (The Handshake)
WebSocket 是建立在 TCP 之上的,但它借用了 HTTP 来握手。
客户端发请求:
GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==服务器回响应:
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=看到 101 Switching Protocols,你就知道:这就不是 HTTP 了,这是一条 raw TCP 管道,以后传的数据就是二进制帧 (Frame) 了。
生产环境的坑
1. 掉线检测 (Heartbeat)
TCP 连接是虚拟的。如果网线被拔了,甚至路由器断电了,只有等到你发数据超时,你才知道断了。 所以必须应用层心跳。 Ping… Pong… Ping… Pong… 如果 30 秒没收到 Pong,立马前端重连。
2. 负载均衡 (Load Balancing)
Nginx 默认支持 WebSocket,但如果你用 PM2 集群或 Kubernetes,WebSocket 是有状态的。你不能把同一个用户的消息推送到错误的服务器进程上。 解决方案:Redis Pub/Sub 做消息中转。
总结
做量化交易,WebSocket 是吃饭的家伙。
如果你还在用 setInterval 轮询价格,请立刻面壁思过。
WebSockets 硬核指南:实时通信的幕后推手
https://www.oferry.com/posts/a44/