WebSocket 与长连接题库

这部分非常适合你后面面 AI 后端、实时消息、流式输出、Swoole 或 Go 服务岗位。

一、为什么需要 WebSocket

标准回答

因为 HTTP 是请求响应模型,客户端要主动轮询;WebSocket 建立的是长连接,可以实现服务端主动推送。

更好的说法

当业务需要实时交互、流式返回、状态持续更新或服务端主动通知时,WebSocket 比轮询更合适。

二、SSE 是什么

SSE,Server-Sent Events,本质上是:

  • 服务端基于 HTTP 持续返回一个流式响应
  • 客户端持续接收服务端推送的事件
  • 通信方向是服务端单向推送给客户端

它常见于:

  • AI token streaming
  • 实时日志
  • 任务进度推送
  • 简单通知流

三、WebSocket 和 HTTP 的区别

  • HTTP:默认请求响应
  • SSE:基于 HTTP 的单向流式推送
  • WebSocket:升级后保持长连接,支持双向通信

四、WebSocket 握手过程

  1. 客户端先发 HTTP Upgrade 请求
  2. 服务端返回 101 Switching Protocols
  3. 协议升级成功,之后走 WebSocket 帧通信

五、为什么 AI 场景经常会用 WebSocket 或 SSE

AI 输出经常是流式的,比如逐 token 返回、生成内容分段返回、任务进度流式更新。

  • 单向流式输出:SSE
  • 双向交互和会话控制:WebSocket

六、SSE 和 WebSocket 的根本区别

  • SSE:单向,服务端推给客户端
  • WebSocket:双向,客户端和服务端都能主动发消息
  • SSE:基于 HTTP 流式响应,没有 Upgrade
  • WebSocket:先走 HTTP Upgrade,再进入帧协议
  • SSE:更适合文本事件流
  • WebSocket:更适合复杂交互、二进制、房间消息、多事件控制

七、什么时候优先选 SSE

如果场景是下面这些,SSE 往往更合适:

  • 只是服务端往前端单向推送
  • 主要是 token streaming、进度更新、日志输出
  • 前端不需要频繁主动给服务端发实时控制消息
  • 想尽量复用 HTTP 基础设施和开发心智

一句话总结:

能用 SSE 解决的单向流式问题,不一定要一上来就 WebSocket。

八、什么时候更适合 WebSocket

如果场景是下面这些,WebSocket 更合适:

  • 客户端和服务端都需要主动发消息
  • 需要实时任务控制,比如暂停、继续、取消
  • 需要房间、频道、多人协作
  • 需要更复杂的消息类型
  • 需要低延迟双向交互

比较典型的就是:

  • IM
  • 实时协作
  • 在线对战
  • 双向语音 / 音视频信令
  • 多事件 AI Agent 会话

九、SSE 的工程注意点

很多人只会说“简单”,但不会说坑点。

真正要注意的是:

  • 反向代理别把流式响应缓冲住
  • 要处理连接超时和自动重连
  • 最好给事件带 id
  • 需要心跳注释或 keepalive,避免中间层断开

SSE 常见优点是简单,但它不是“零治理成本”。

十、WebSocket 的工程注意点

  • 指数退避
  • 心跳检测
  • 断线重连
  • 重连后重新鉴权
  • connection -> user 映射
  • 多实例下的消息路由
  • 广播风暴和热点频道

十一、为什么很多 AI 场景先用 SSE 而不是 WebSocket

因为很多 AI 页面看起来像“实时交互”,但实际上数据流经常是:

  • 用户先发一个普通 HTTP 请求
  • 服务端开始持续把生成结果往前端推

这条链路本质上仍然是“客户端发起一次请求,服务端持续往回写流”。

如果只是这样,SSE 就够了。

这里很容易讲错的一点

很多人会说:

  • “只要有取消按钮,就必须 WebSocket”

其实不一定。

很多系统完全可以这样做:

  • 输出流用 SSE
  • 取消任务走单独 HTTP 接口

所以不要把“有一点交互”直接等价成“必须 WebSocket”。

十二、认证怎么做

  • 握手时带 token
  • 握手成功后绑定用户身份
  • 服务端维护 connection -> user 映射

如果是 SSE,一般是请求阶段就完成鉴权; 如果是 WebSocket,还要继续考虑:

  • token 过期怎么处理
  • 重连后如何重新认证
  • 多 tab / 多设备连接如何识别

十三、多实例部署下怎么推消息

如果服务有多实例,不能假设用户一定连在当前机器上,所以一般会通过:

  • Redis Pub/Sub
  • Kafka
  • 消息总线
  • 或统一连接网关层

十四、连接数很大时要注意什么

  • 连接占用内存
  • 心跳成本
  • 广播成本
  • 单机 fd 限制
  • 负载均衡和连接保持
  • 热点房间 / 热点频道

十五、结合你的项目怎么讲

虽然你历史主项目不一定是典型 IM,但你完全可以从 AI 后端角度讲:

  • 如果做 AI 对话服务,需要把模型输出流式返回给前端
  • 如果是单向 token streaming,可以考虑 SSE
  • 如果要做会话控制、任务取消、实时状态、多事件消息,更适合 WebSocket

十六、技术总监最爱问的问题

1. 为什么不用轮询

因为实时性差、请求浪费大、服务端和客户端都更耗资源。

2. WebSocket 最大难点是什么

不是建连接,而是长连接管理、鉴权、心跳、断线重连、多实例路由和消息分发。

3. AI 场景用 WebSocket 还是 SSE

如果只是单向流式输出,SSE 更简单;如果要更强交互能力,WebSocket 更合适。

4. SSE 和 WebSocket 怎么选,能不能一句话讲清

可以。

单向流式推送优先 SSE,双向实时交互优先 WebSocket。

十七、你最适合背的总结句

我对 SSE 和 WebSocket 的理解重点不是记协议名,而是看通信方向和治理成本。如果只是服务端单向把 token、进度、日志持续推给前端,SSE 往往更简单;如果要双向实时交互、任务控制、多人协作或复杂消息路由,WebSocket 更合适。但 WebSocket 带来的长连接治理成本也更高,所以不是所有流式场景都需要它。