news 2026/9/16 13:39:31

system-design-notes:长轮询、短轮询、SSE、WebSocket,实时通信4种方案终极对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
system-design-notes:长轮询、短轮询、SSE、WebSocket,实时通信4种方案终极对比

system-design-notes:长轮询、短轮询、SSE、WebSocket,实时通信4种方案终极对比

【免费下载链接】system-design-notesNotes of the book System Desgin Interview - An Insider's Guide项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-notes

system-design-notes 是基于《System Design Interview - An Insider's Guide》整理的系统设计面试笔记开源项目,其中「Design A Chat System」与「Design Google Maps」章节系统性地对比了短轮询、长轮询、SSE(Server-Sent Events)和 WebSocket 四种实时通信方案。本文提炼笔记精华,带你一次性搞清楚:这 4 种实时通信方案各自怎么工作、优劣在哪、真实生产环境该选谁。🎯

为什么需要实时通信?

以聊天系统为例,发送方把消息交给聊天服务(存储并转发),接收方必须尽快收到。但浏览器本质上是"请求-响应"模型——客户端只能主动问,服务器无法主动"敲门"。如何打破这个限制?业界的答案就是下面 4 种方案,复杂度与实时性依次递增。👇

短轮询:最简单粗暴的实时通信方式

客户端每隔固定时间向服务器发一次请求:"有新消息吗?"服务器立刻回答"有/没有",连接随即关闭。轮询间隔内没有新消息就继续等下一轮。

![短轮询原理时序图:客户端周期性询问服务器是否有新消息,实时通信方案对比](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/12. Chat System/images/polling.png?utm_source=gitcode_repo_files)

优点:实现极简,纯 HTTP 短连接,对代理、防火墙友好,兼容性最好。

缺点

  • 延迟高:最坏情况下要等一个完整轮询周期才能收到消息
  • 大量无效请求:如上图所示,绝大多数回答都是 "NO",白白消耗带宽
  • 频繁建立/断开连接,服务器开销大

长轮询:低延迟的"过渡方案"

长轮询改进了"空等"问题:客户端发起请求后,服务器不立刻回复,而是把连接挂起,一直等到新消息产生(或超时)才返回。客户端收到响应后立刻发起下一次请求,如此循环,形成"伪推送"效果。

![长轮询时序图:服务端挂起连接等待新消息或超时后返回,实时通信方案对比](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/12. Chat System/images/long-polling.png?utm_source=gitcode_repo_files)

优点

  • 延迟远低于短轮询(消息一到就返回)
  • 依然是标准 HTTP,兼容性好

缺点

  • 不活跃用户不友好:连接被长时间挂起,占用服务器资源(原笔记原文:Inefficient for inactive users
  • 本质上仍是客户端单向拉取,每轮都要重新走一遍请求
  • 超时、代理缓冲等边界情况需要额外处理

SSE:浏览器原生的服务器推送

SSE(Server-Sent Events)基于普通 HTTP:客户端发起一次请求后,服务器保持连接打开,持续向下推送文本事件流,浏览器通过内置的EventSourceAPI 接收。

优点

  • 真正的服务器→客户端单向推送,延迟低
  • 浏览器原生支持,内置自动重连,并可通过Last-Event-ID断点续传
  • 走 HTTP 协议,部署简单

缺点

  • 只能单向(服务器→客户端),客户端上行仍需额外通道
  • 只传文本,不支持二进制
  • 同一域名的并发连接数受浏览器限制

适用场景:股票行情、新闻推送、进度通知等"服务器播报、用户只听"的场景。📈

WebSocket:全双工双向通信的终极方案

WebSocket 通过一次 HTTP 握手(Upgrade)后,把连接升级为ws协议,建立全双工持久连接:连接建立后,客户端和服务器可以随时互发消息,无需反复请求。

![WebSocket 握手与双向消息时序图:HTTP 握手升级为双向全双工连接,实时通信方案终极对比](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/12. Chat System/images/websocket.png?utm_source=gitcode_repo_files)

优点

  • 真正双向、低开销(轻量帧头,支持二进制),延迟最低
  • 一次握手,长期复用,连接数远少于轮询方案

缺点

  • 连接是有状态的:服务器必须长期持有连接,扩容、故障转移、服务发现都要专门设计
  • 心跳保活、断线重连、负载均衡粘滞会话等都要自己处理

4种方案一张表看懂

维度短轮询长轮询SSEWebSocket
通信方向客户端拉取客户端拉取服务器单向推送全双工双向
连接模型短连接,反复开关挂起等待长连接持久连接
实时性低(≤轮询间隔)较低最低 ⚡
服务器开销高(无效请求多)低(连接状态需管理)
浏览器支持良好(单向)
典型场景简单状态检查遗留系统、代理受限环境行情、通知、进度聊天、游戏、协同编辑

到底怎么选?实战选择指南

结合笔记中 Google Maps 章节的真实决策逻辑(位置更新如何主动推给客户端):

  • 单向推送为主(导航提醒、状态播报):SSE 就够了,实现成本低
  • 需要双向高频交互(聊天、多人游戏、实时协作):选 WebSocket。Google Maps 笔记原文:"We can also use server-sent events (SSE) but lean towards web sockets as they support bi-directional communication"——正是看中了双向通信在"最后一公里配送"这类场景的灵活性
  • 老系统 / 严格代理环境:长轮询兜底
  • 快速验证或资源极受限:短轮询

实战案例:聊天系统中如何落地 WebSocket

system-design-notes 的「Design A Chat System」章节(5000 万 DAU 规模)给出了完整的工程化设计,值得对照学习:

![聊天系统无状态/有状态分层架构:WebSocket 聊天服务器 + 服务发现,实时通信系统设计](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/12. Chat System/images/high-level-stateless-arch.png?utm_source=gitcode_repo_files)

1. 无状态 + 有状态服务分层:注册、登录、用户资料等走无状态 API 服务;聊天服务器(Chat Server)专门持有 WebSocket 持久连接,负责消息投递。服务发现组件(如 Zookeeper)根据地理位置和负载,为客户端挑选最优聊天服务器。

2. 心跳机制判断在线状态:客户端每 5 秒向 presence 服务器发一次心跳;若 30 秒未收到心跳,即标记为离线。

![聊天系统心跳机制时序图:客户端定时发送 heartbeat,30秒无心跳判定离线](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/12. Chat System/images/heartbeat-mechanism.png?utm_source=gitcode_repo_files)

3. 在线状态扇出(Fanout):用户 A 的上下线状态变更,通过发布-订阅模型发布到 A-B、A-C、A-D 等频道,好友 B、C、D 各自订阅对应频道,实时收到状态更新。

![聊天系统在线状态扇出模型:通过 pub/sub 频道向好友推送在线状态,WebSocket 实时通信设计](https://raw.gitcode.com/GitHub_Trending/sy/system-design-notes/raw/9d8388721e7231442763ad37398b8d82224aa68f/12. Chat System/images/fanout-presence.png?utm_source=gitcode_repo_files)

这正是 WebSocket 方案的完整闭环:持久连接负责消息投递,心跳负责存活检测,pub/sub 负责状态广播。💬

项目内相关资料

  • 聊天系统设计全章:12. Chat System/Readme.md
  • 位置更新推送协议对比(SSE vs WebSocket vs 长轮询):18. Google Maps/README.md
  • 全书章节目录(28 章系统设计):Readme.md

掌握这 4 种实时通信方案的取舍逻辑,是系统设计面试(聊天、协同、IM、行情类题目)绕不开的基本功。建议对照原文反复看图理解时序细节,面试时能画出上图这几张时序图,基本就赢了一半。🚀

【免费下载链接】system-design-notesNotes of the book System Desgin Interview - An Insider's Guide项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-notes

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 13:38:16

抖音批量下载教程:Douyin Downloader 从安装到保存整个作者主页

抖音批量下载教程:Douyin Downloader 从安装到保存整个作者主页 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…

作者头像 李华
网站建设 2026/9/16 13:34:46

C#上位机开发:数据绑定与线程安全实践

1. 为什么数据绑定是C#上位机的命门?刚入行时我做过一个工业温控项目,界面上要实时显示20个传感器的数据。最初用最土的办法:在每个TextBox的TextChanged事件里手动更新变量,结果代码写成了一团乱麻,数据延迟高达500ms…

作者头像 李华
网站建设 2026/9/16 13:33:28

system-design-notes 第14章:设计YouTube视频平台完整指南

system-design-notes 第14章:设计YouTube视频平台完整指南 【免费下载链接】system-design-notes Notes of the book System Desgin Interview - An Insiders Guide 项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-notes system-design-no…

作者头像 李华