选型

WebSocket

你可能会说

页面要一直实时更新,轮询太费,什么时候非上 WebSocket 不可?

一次握手之后,浏览器和服务器之间一直开着的双向通道用普通 HTTP 升级握手建连,之后两端随时互发消息,不用每次带完整请求头。适合聊天、协同编辑、实时行情、游戏。代价是连接得自己管:重连、心跳、鉴权、网关和负载均衡都要为长连接做适配。
也常被叫作WS长连接
先问一句服务端要随时推、客户端也要发?
默认WebSocket→擅长双向实时→别用一次请求一次响应
成熟度采用

什么时候选它

  • 聊天、协同编辑、实时行情、多人游戏
  • 客户端也要频繁上行,不只是收推送
  • 延迟敏感,轮询的间隔和开销都受不了

什么时候别选

  • 只是服务端单向推进度或通知(SSE 更省事)
  • 一问一答的普通接口
  • 网关、负载均衡不支持长连接,又不打算改
容易混在一起 · 怎么分
WebSocket≠HTTP 轮询

WebSocket 是一条持续的双向连接;轮询每次都是新请求,实时性和开销都差一截。

WebSocket≠SSE

WebSocket 双向;SSE 只能服务端往下推,但自带断线重连,走普通 HTTP。

WebSocket≠Socket.IO

WebSocket 是协议(RFC 6455);Socket.IO 是带降级和重连的封装库。

Q面试会问什么

  • 问:握手是怎么完成的?
    答:客户端发带 Upgrade: websocket 的 HTTP 请求,服务端回 101,用 Sec-WebSocket-Key 校验后切换到帧协议。
  • 问:为什么需要心跳和重连?
    答:中间代理会悄悄断开空闲连接,应用层感知不到;要定期 ping/pong 并做指数退避重连。
  • 问:怎么做鉴权?
    答:握手阶段带 token(cookie 或 query);连接建立后不能再改请求头。
  • 问:多实例怎么广播?
    答:连接散在各节点上,要用 Redis Pub/Sub 或消息队列把消息转发到所有节点。
延伸阅读 · 权威出处