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 的根本原因是:

  1. 业务匹配:完美契合流式文本生成需求
  2. 成本优化:节省服务器资源,降低开发复杂度
  3. 扩展友好:天然适配云原生架构(K8s 自动扩缩容)

这就像选择交通工具:

  • SSE 是直达高铁(专为单向流式场景设计)
  • WebSocket 是直升机(灵活但维护成本高)

    ChatGPT 的"点到点文本运输"需求,显然高铁更经济高效!

最后文章有啥不对,欢迎大佬在评论区指点!!!

如果感觉对你有帮助就点赞推荐或者关注一下吧!!!

ChatGPT为何放弃WebSocket?揭秘EventSource的三大决胜优势的更多相关文章

  1. 利用WebSocket和EventSource实现服务端推送

    可能有很多的同学有用 setInterval 控制 ajax 不断向服务端请求最新数据的经历(轮询)看下面的代码: setInterval(function() { $.get('/get/data- ...

  2. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  3. python模拟websocket握手过程中计算sec-websocket-accept

    背景 以前,很多网站使用轮询实现推送技术.轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器.轮询的缺点很明显,浏览器需要不断的向服 ...

  4. WebSocket协议分析

    WebSocket协议分析 1.什么是WebSocket协议 WebScoket协议是基于TCP协议建立的全双工通信,所谓的全双工通信就是双向同时通信. 2.WebSocket协议优点 WebSock ...

  5. Uniapp使用GoEasy实现websocket实时通讯

    Uniapp作为近来最火的移动端开发技术,一套代码,可以打包成Android/iOS app和各种平台的小程序,可谓是没有最方便只有更方便. GoEasy上架DCloud Uniapp插件市场已经有一 ...

  6. 微信小程序使用GoEasy实现websocket实时通讯

    不需要下载安装,便可以在微信好友.微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好东西~ 同时因为微信小程序使用的是Jav ...

  7. 如何使用ChatGPT来自动化Python任务

    1.概述 最近,比较火热的ChatGPT很受欢迎.今天,笔者为大家来介绍一下ChatGPT能做哪些事情. 2.内容 ChatGPT是一款由OpenAI开发的专门从事对话的AI聊天机器人.它的目标是让A ...

  8. 掘金 Android 文章精选合集

    掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...

  9. JavaScript之web通信

    web通信,一个特别大的topic,涉及面也是很广的.因最近学习了 javascript 中一些 web 通信知识,在这里总结下.文中应该会有理解错误或者表述不清晰的地方,还望斧正! 一.前言 1. ...

  10. 【转】JavaScript之web通信

    原文转自:http://cloudbbs.org/forum.php?mod=viewthread&tid=28773&page=1&extra=#pid180304 一.前言 ...

随机推荐

  1. 设计原则&模式:单例模式(创建型)

    定义:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式. 五种实现方式: 饿汉式 懒汉式 双重校验 静态内部类 枚举类 饿汉式 特点:线程安全,调用效率高,但是不 ...

  2. PHP开发技巧:如何实现数据过滤功能

    输入过滤 输出过滤 1.输入过滤 1.1前端验证 JavaScript的方式,正则等,(略) 1.2后端验证 1.2.1 使用filter_var函数 PHP提供了filter_var函数用于过滤和验 ...

  3. Navicat 数据库如何再次打开恢复上次的页面

    选项->选项卡->从上次离开的画面继续 2.其他软件有这个需求也可以在设置里找一找!

  4. 【Unit4】UML解析器(模型化设计)-作业总结 & 【BUAA-OO】课程总结

    第四单元作业总结 1.题目概述 UML类图建模与查询(8) + UML顺序图/状态图建模与查询(3+3) + 模型错误检查(9),三次迭代共23条命令 2.构架设计 一开始以为和第三单元差不多,稍微用 ...

  5. Web前端入门第 14 问:HTML 语义化是什么?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 语义化:通俗地说,就是让机器可以理解编写出来的 HTML 代码.比如:搜索引擎.屏幕阅读器等. 非语义化写法 网 ...

  6. idea 导入普通的项目后,无法发布

    之前一直都是在eclipse开发,现在改idea,但是很多隐藏的功能,都不晓得在哪里找到. 问题: 新导入一个spring 项目(没有maven),在界面上看是没有问题,但是使用tomcat部署项目的 ...

  7. 解决本地代理问题 git 或者 curl Failed to connect to 127.0.0.1 port 1087 after 8 ms: Connection refused

    问题出现原因 git配置了代理 本地配置了代理 执行这个命令可以看到自己的代理设置: env | grep -I proxy 临时更改代理 在当前终端执行以下命令,就可以临时将代理取消掉 export ...

  8. wincurl:一款基于HTTP协议的轻量级web资源抓取和上传工具

    编写web程序经常要进行接口调测,通常我们会使用curl或者postman等工具,通过这些工具可以方便的发送GET或POST请求来验证接口的正确与否. 对于复杂的接口业务,我们可以通过这些工具构造po ...

  9. .NET8中gRPC的使用

    在现代分布式系统中,服务之间的通信是一个非常重要的环节.随着微服务架构的流行,服务之间的通信方式也在不断演进.gRPC作为一种高性能.跨语言的RPC框架,逐渐成为了我们的首选. 一.简介 gRPC 是 ...

  10. 查看SELinux状态:

    1./usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态SELinux status:                 enabl ...