409 字
2 分钟
WebSockets 硬核指南:实时通信的幕后推手

为什么要用 WebSocket?#

在 WebSocket 出现之前,如果你想做一个股票行情页面,你只能用 AJAX 轮询 (Polling)。 浏览器:即使没有新数据,我也每秒问服务器一次:“有新价格吗?” 服务器:“没有。” 浏览器:“有新价格吗?” 服务器:“没有。” … 这就像一个焦虑的男盆友,效率极低,还浪费带宽。

WebSocket 是全双工的。 连接一旦建立,就像拉了一根专线。 服务器:“哥们,BTC 跌了!” -> 浏览器。 不需要问,直接推。

握手协议 (The Handshake)#

WebSocket 是建立在 TCP 之上的,但它借用了 HTTP 来握手。

客户端发请求:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

服务器回响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-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/
作者
晨平安
发布于
2026-02-07
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00