|
| 1 | +--- |
| 2 | +title: 聊聊四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE |
| 3 | +shortTitle: 聊聊四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE |
| 4 | +author: 勇哥 |
| 5 | +category: |
| 6 | + - 微信公众号 |
| 7 | +--- |
| 8 | + |
| 9 | +这篇文章,我们聊聊 四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE 。 |
| 10 | + |
| 11 | +# 1 短轮询 |
| 12 | + |
| 13 | +浏览器 **定时**(如每秒)向服务器发送 HTTP 请求,服务器立即返回当前数据(无论是否有更新)。 |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +* **优点**:实现简单,兼容性极佳 |
| 18 | +* **缺点**:高频请求浪费资源,实时性差(依赖轮询间隔) |
| 19 | +* **延迟**:高(取决于轮询频率) |
| 20 | +* **适用场景**:兼容性要求高,延迟不敏感的简单场景。 |
| 21 | + |
| 22 | +笔者职业生涯印象最深刻的短轮询应用场景是**比分直播**: |
| 23 | + |
| 24 | + |
| 25 | + |
| 26 | +如图所示,用户进入比分直播界面,浏览器定时查询赛事信息(比分变动、黄红牌等),假如数据有变化,则重新渲染页面。 |
| 27 | + |
| 28 | +这种方式实现起来非常简单可靠,但是频繁的调用后端接口,会对后端性能会有影响(主要是 CPU)。同时,因为依赖轮询间隔,页面数据变化有延迟,用户体验并不算太好。 |
| 29 | + |
| 30 | +# 2 长轮询 |
| 31 | + |
| 32 | +浏览器发送 HTTP 请求后,服务器 **挂起连接** 直到数据更新或超时,返回响应后浏览器立即发起新请求。 |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | +* **优点**:减少无效请求,比短轮询实时性更好 |
| 37 | +* **缺点**:服务器需维护挂起连接,高并发时资源消耗大 |
| 38 | +* **延迟**:中(取决于数据更新频率) |
| 39 | +* **适用场景**:需要较好实时性且无法用 WebSocket/SSE 的场景(如消息通知) |
| 40 | + |
| 41 | +长轮询最常见的应用场景是:配置中心,我们耳熟能详的注册中心 Nacos 、阿波罗都是依赖长轮询机制。 |
| 42 | + |
| 43 | + |
| 44 | + |
| 45 | +Nacos长轮询 |
| 46 | + |
| 47 | +> 客户端发起请求后,Nacos 服务端不会立即返回请求结果,而是将请求挂起等待一段时间,如果此段时间内服务端数据变更,立即响应客户端请求,若是一直无变化则等到指定的超时时间后响应请求,客户端重新发起长轮询。 |
| 48 | +
|
| 49 | +# 3 WebSocket |
| 50 | + |
| 51 | +基于 TCP 的全双工协议,通过 HTTP 升级握手(**Upgrade: websocket**)建立持久连接(**双向实时通信)。** |
| 52 | + |
| 53 | + |
| 54 | + |
| 55 | +* **优点**:最低延迟,支持双向交互,节省带宽 |
| 56 | +* **缺点**:实现复杂,需单独处理连接状态 |
| 57 | +* **延迟**:极低 |
| 58 | +* **适用场景**:聊天室、在线游戏、协同编辑等 **高实时双向交互** 需求 |
| 59 | + |
| 60 | +笔者曾经服务于北京一家电商公司,参与直播答题功能的研发。 |
| 61 | + |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +直播答题整体架构见下图: |
| 67 | + |
| 68 | + |
| 69 | + |
| 70 | +TCP 网关的技术选型是:Netty、ProtoBuf、WebSocket ,选择 WebSocket 是因为它支持双向实时通信,同时 Netty 内置了 WebSocket 实现类,工程实现起来相对简单。 |
| 71 | + |
| 72 | +# 4 Server Send Event(SSE) |
| 73 | + |
| 74 | +基于 HTTP 协议,服务器可 **主动推送** 数据流(如`Content-Type: text/event-stream`),浏览器通过`EventSource` API 监听。 |
| 75 | + |
| 76 | + |
| 77 | + |
| 78 | +* **优点**:原生支持断线重连,轻量级(HTTP协议) |
| 79 | +* **缺点**:单向通信(服务端--》客户端),低版本 IE 浏览器不支持 |
| 80 | +* **延迟**:低(服务器可即时推送) |
| 81 | +* **适用场景**:股票行情、实时日志等 **服务器单向推送** 需求。 |
| 82 | + |
| 83 | +SSE 最经典的应用场景是 : DeepSeek web 聊天界面 ,如图所示: |
| 84 | + |
| 85 | + |
| 86 | + |
| 87 | +当在 DeepSeek 对话框发送消息后,浏览器会发送一个 HTTP 请求 ,服务端会通过 SSE 方式将数据返回到浏览器。 |
| 88 | + |
| 89 | + |
| 90 | + |
| 91 | +# 5 总结 |
| 92 | + |
| 93 | +**特性**|**短轮询**|**长轮询**|**SSE**|**WebSocket**| |
| 94 | +---|---|---|---|---| |
| 95 | +**协议**|HTTP |
| 96 | +|HTTP |
| 97 | +|HTTP |
| 98 | +|WebSocket(基于TCP) |
| 99 | +| |
| 100 | +**实时性**|低 |
| 101 | +|中 |
| 102 | +|高 |
| 103 | +|极高 |
| 104 | +| |
| 105 | +**资源消耗**|高(频繁请求) |
| 106 | +|中(挂起连接) |
| 107 | +|低 |
| 108 | +|低(长连接) |
| 109 | +| |
| 110 | + |
| 111 | +**选择建议**: |
| 112 | + |
| 113 | +* 需要 **简单兼容性** → 短轮询 |
| 114 | +* 需要 **中等实时性** → 长轮询 |
| 115 | +* 只需 **服务器推送** → SSE |
| 116 | +* 需要 **全双工实时交互** → WebSocket |
| 117 | + |
| 118 | +* * * |
| 119 | + |
| 120 | +往期推荐: |
| 121 | + |
| 122 | +[这几个实战专栏,相当炸裂!](https://mp.weixin.qq.com/s?__biz=MzIyNTYzNDE5MQ==&mid=2247520060&idx=1&sn=c03b2b626e467243222d22591264222a&scene=21#wechat_redirect) |
| 123 | + |
| 124 | +[短信服务 platform-sms 0.6.1 发布](https://mp.weixin.qq.com/s?__biz=MzIyNTYzNDE5MQ==&mid=2247519195&idx=1&sn=bfdc712051446c6abb1c9616978b5846&scene=21#wechat_redirect) |
| 125 | + |
| 126 | +[看完这一篇,ShardingSphere-jdbc 实战再也不怕了](https://mp.weixin.qq.com/s?__biz=MzIyNTYzNDE5MQ==&mid=2247511645&idx=1&sn=b81aecc9ff727ef880c6bcf841169737&scene=21#wechat_redirect) |
| 127 | + |
| 128 | +[我写了一个教学型的任务调度系统,很强!](https://mp.weixin.qq.com/s?__biz=MzIyNTYzNDE5MQ==&mid=2247520043&idx=1&sn=f06597b5a39236dbd5d34017d5a8d359&scene=21#wechat_redirect) |
| 129 | + |
| 130 | +最后,欢迎加入我的知识星球,今年会有非常有趣的专栏,大家拭目以待。 |
| 131 | + |
| 132 | + |
| 133 | + |
| 134 | +记得**添加我的微信(zhangyongtaozhe)**: |
| 135 | + |
| 136 | + |
| 137 | + |
| 138 | +>参考链接:[https://mp.weixin.qq.com/s/NIACuNgHtSFgKHc7T1G3Wg](https://mp.weixin.qq.com/s/NIACuNgHtSFgKHc7T1G3Wg),整理:沉默王二 |
0 commit comments