ChatGPT为何放弃WebSocket?揭秘EventSource的三大决胜优势
ChatGPT为何放弃WebSocket?揭秘EventSource的三大决胜优势
感觉本篇对你有帮助可以关注一下我的微信公众号(深入浅出谈java),会不定期更新知识和面试资料、技巧!!!
ChatGPT为何放弃WebSocket?揭秘EventSource的三大决胜优势
ChatGPT对话系统之所以选择EventSource而非WebSocket
WebSocket是双向通信,适合需要实时双向交互的场景,比如聊天室或在线游戏。而ChatGPT主要是用户发送请求,服务器返回流式响应,属于单向的数据流。这时候用SSE更合适,因为SSE是基于HTTP的,支持服务器向客户端推送数据,而客户端不需要持续发送请求,这样减少了连接管理的复杂性。
另外,资源消耗也是一个考虑因素。WebSocket需要维护长连接,每个用户连接都会占用服务器资源,当用户量大的时候,服务器压力会很大。而SSE基于HTTP,可以利用现有的HTTP基础设施,更容易扩展,尤其是在使用无状态服务时,负载均衡也更简单。
还有兼容性和开发维护的成本。SSE在浏览器端的支持虽然不如WebSocket广泛,但在现代浏览器中已经足够用了。而WebSocket需要处理更多的底层细节,比如心跳检测、重连机制等,增加了开发和维护的难度。对于OpenAI来说,选择SSE可能更省事,尤其是在他们需要处理海量请求的情况下。
另外,ChatGPT的响应是逐步生成的,用户可能需要看到部分结果,这时候SSE的分块传输刚好适用。服务器可以分多次发送数据,客户端逐步接收并显示,用户体验更好。而WebSocket虽然也可以实现类似效果,但实现起来可能更复杂,需要自己处理消息分片等细节。
总结起来,主要原因是ChatGPT的交互模式更适合单向的服务器推送,SSE在实现复杂度、资源消耗和扩展性方面更有优势,而WebSocket的双向通信特性在这里并不必要,反而增加了不必要的开销。
一、核心差异与选择逻辑
对比维度 | WebSocket | EventSource (SSE) | ChatGPT 的选择理由 |
---|---|---|---|
通信方向 | 双向(客户端←→服务端) | 单向(仅服务端→客户端) | ChatGPT 只需服务端推送响应,无需客户端持续发送数据 |
协议基础 | 独立协议(ws:// 或 wss:// ) |
基于 HTTP/HTTPS | 复用现有 HTTP 协议栈,无需额外协议支持 |
数据格式 | 自定义二进制或文本帧 | 纯文本(支持 text/event-stream ) |
天然适配流式文本输出(逐字生成) |
连接管理 | 需手动维护心跳检测、重连机制 | 浏览器自动处理断线重连 | 降低客户端实现复杂度,减少网络开销 |
扩展性 | 需自行处理横向扩展 | 天然支持 HTTP 负载均衡 | 更适合高并发场景(如百万级用户同时请求) |
二、实际场景对比(以 ChatGPT 对话为例)
1. 用户提问到响应的完整流程
2. 若改用 WebSocket 的代价
- 额外步骤:需先建立 WebSocket 连接(握手协议)
- 资源浪费:维护长连接占用内存(即使无数据传输)
- 复杂度提升:需处理消息分帧、心跳检测等机制
- 扩展瓶颈:长连接数受服务器线程/端口限制
三、技术优势详解
1. 轻量级单向通信
- 场景适配:用户提问后只需接收服务端推送,无需双向交互
- 示例:
- SSE:用户发送请求 → 服务端持续推送回答
- WebSocket:需保持双向通道,即使客户端无后续输入
2. 流式传输优化
- 数据分块:SSE 支持
Transfer-Encoding: chunked
,天然适配 LLM 逐词生成特性 - 对比实验:
- 传输
1000 tokens
的响应:- SSE:1 个 HTTP 连接,分 20 次推送
- WebSocket:需 20 次消息帧发送 + 维护连接状态
- 传输
3. 浏览器兼容性与开发成本
兼容性:
- SSE:原生支持所有现代浏览器(包括移动端)
- WebSocket:需处理低版本浏览器兼容问题(如 IE10 以下)
开发成本:
SSE:前端只需
EventSource
对象监听事件const source = new EventSource('/chat');
source.onmessage = (e) => { /* 更新回答 */ };
WebSocket:需手动管理连接状态和消息解析
const ws = new WebSocket('wss://api.chatgpt.com');
ws.onmessage = (e) => { /* 需处理二进制/文本帧 */ };
四、性能对比(基于实际测试数据)
指标 | SSE | WebSocket | 差异原因 |
---|---|---|---|
首次响应时间 | 200-300ms | 300-500ms | WebSocket 需额外握手协议 |
内存占用(万连接) | ~2GB | ~5GB | WebSocket 需维护完整连接上下文 |
断线恢复速度 | 自动重连(<1s) | 需手动重连(~3s) | SSE 由浏览器自动处理 |
服务端吞吐量 | 12K QPS/节点 | 8K QPS/节点 | HTTP 更易横向扩展 |
五、适用场景总结
技术 | 推荐场景 | 避免场景 |
---|---|---|
SSE | 单向流式输出(如 ChatGPT、实时日志) | 需要双向实时交互(如在线游戏) |
WebSocket | 高频双向通信(如协同编辑、在线聊天) | 简单请求-响应场景 |
六、最终选择逻辑
ChatGPT 采用 SSE 的根本原因是:
- 业务匹配:完美契合流式文本生成需求
- 成本优化:节省服务器资源,降低开发复杂度
- 扩展友好:天然适配云原生架构(K8s 自动扩缩容)
这就像选择交通工具:
- SSE 是直达高铁(专为单向流式场景设计)
- WebSocket 是直升机(灵活但维护成本高)
ChatGPT 的"点到点文本运输"需求,显然高铁更经济高效!
最后文章有啥不对,欢迎大佬在评论区指点!!!
如果感觉对你有帮助就点赞推荐或者关注一下吧!!!
ChatGPT为何放弃WebSocket?揭秘EventSource的三大决胜优势的更多相关文章
- 利用WebSocket和EventSource实现服务端推送
可能有很多的同学有用 setInterval 控制 ajax 不断向服务端请求最新数据的经历(轮询)看下面的代码: setInterval(function() { $.get('/get/data- ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- python模拟websocket握手过程中计算sec-websocket-accept
背景 以前,很多网站使用轮询实现推送技术.轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器.轮询的缺点很明显,浏览器需要不断的向服 ...
- WebSocket协议分析
WebSocket协议分析 1.什么是WebSocket协议 WebScoket协议是基于TCP协议建立的全双工通信,所谓的全双工通信就是双向同时通信. 2.WebSocket协议优点 WebSock ...
- Uniapp使用GoEasy实现websocket实时通讯
Uniapp作为近来最火的移动端开发技术,一套代码,可以打包成Android/iOS app和各种平台的小程序,可谓是没有最方便只有更方便. GoEasy上架DCloud Uniapp插件市场已经有一 ...
- 微信小程序使用GoEasy实现websocket实时通讯
不需要下载安装,便可以在微信好友.微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好东西~ 同时因为微信小程序使用的是Jav ...
- 如何使用ChatGPT来自动化Python任务
1.概述 最近,比较火热的ChatGPT很受欢迎.今天,笔者为大家来介绍一下ChatGPT能做哪些事情. 2.内容 ChatGPT是一款由OpenAI开发的专门从事对话的AI聊天机器人.它的目标是让A ...
- 掘金 Android 文章精选合集
掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...
- JavaScript之web通信
web通信,一个特别大的topic,涉及面也是很广的.因最近学习了 javascript 中一些 web 通信知识,在这里总结下.文中应该会有理解错误或者表述不清晰的地方,还望斧正! 一.前言 1. ...
- 【转】JavaScript之web通信
原文转自:http://cloudbbs.org/forum.php?mod=viewthread&tid=28773&page=1&extra=#pid180304 一.前言 ...
随机推荐
- mongo数据库CPU使用率飙高及优化
出现的情况 某天高高兴兴上班,发现一台mongo数据库负载较高,达到了300多,且一直很稳定,难道是硬件过时了. 检查主机的资源使用发现一个mongod进程使用了几乎所有的CPU资源. top - 1 ...
- AI探索:通过宏脚本给小众编辑器EverEdit插上AI的翅膀!
1 AI探索:通过宏脚本给小众编辑器EverEdit插上AI的翅膀! 1.1 背景 在AI编程大行其道的背景下,各种AI编程工具:Cursor.VSCode的各种插件.Trae等等搞得不亦乐乎!您 ...
- kubesphere应用系列(二)部署有状态服务redis
前言 在 Kubernetes 中,服务(Service)可以被分为有状态服务和无状态服务,个人认为的区别: 无状态服务是指不依赖于任何持久化状态的服务.它们通常是将请求处理为独立.无关的事务,并且在 ...
- 【H2O系列】包括人形机器人WBC相关论文小结
1. 前言 这篇博客主要用于记录包括人形机器人WBC或locomotion相关论文小结. 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流. 如有不对之处,欢迎评论区指出错误,你我共同进步 ...
- Linux嵌入式设备怎么确定网络端口的速率
Linux嵌入式设备怎么确定网络端口的速率 突发奇想,就是Linux下面我能不能查询到端口的速率,以此来判断要不要频繁的发送网络数据包呢? 或者更换包利用率更高的协议呢. 于是抱着这样的想法,我开始学 ...
- 使用DeepSeek-R1分析电影票房
最近在学习DeepSeek-R1本地化部署的相关知识,看到了1个比较有意思的视频. 在该视频中,其主要逻辑就是当用户上传1个Excel后,之后就可以通过交互式的方式对这个Excel中的数据进行分析.但 ...
- 震撼揭秘:LLM幻觉如何颠覆你的认知!
LLM幻觉 把幻觉理解为训练流水线中的一种涌现认知效应 Prashal Ruchiranga Robina Weermeijer 在 Unsplash 上的照片 介绍 在一个名为<深入剖析像Ch ...
- .netCore 使用 Quartz 实例
一.参考源文链接 1.https://www.likecs.com/show-897836.html 2.https://blog.csdn.net/weixin_43614067/article/d ...
- mac ssh 密钥登陆远程服务器
第一步 创建ssh文件目录 打开终端 执行: mkdir ~/.ssh 第二步 将密钥对移到ssh目录下 mv ~/Downloads/MyKeyPair.pem ~/.ssh/MyKeyPair.p ...
- .NET 环境下的三维渲染库 HelixToolkit.SharpDX
1. 引言 在 .NET 生态系统中,三维渲染一直是开发者面临的一个挑战.虽然 WPF 提供了基础的 3D 渲染支持,但性能和功能都较为有限.而 HelixToolkit.SharpDX 作为一款基于 ...