【每天5分钟,了解一个知识点】
在使用 ChatGPT 的过程中,我们会发现它采用了流式数据返回的方式,而在技术实现上,它选择了 SSE(Server-Sent Events)协议,而非 WebSocket。这背后究竟有哪些原因呢?让我们一起来深入探讨。
一、ChatGPT 的使用场景与需求
作为一个基于深度学习的大型语言模型,ChatGPT 需要处理大量的自然语言数据。想象一下,当我们向 ChatGPT 提出一个复杂的问题时,它就像是一位知识渊博的学者,需要在庞大的知识海洋中搜索、分析和整理信息,这无疑需要大量的计算资源和时间。相较于普通的读取数据库操作,ChatGPT 的响应速度自然会慢许多。
对于这种可能需要长时间等待响应的对话场景,ChatGPT 采用了一种巧妙的策略:它会将已经计算出的数据“推送”给用户,并利用 SSE 技术在计算过程中持续返回数据。这样做的好处是显而易见的,它可以避免用户因等待时间过长而选择关闭页面。
二、什么是 SSE?
SSE(Server-Sent Events)是一种 Web 技术,它允许服务器实时向客户端推送数据。打个比方,就像你在看一场直播,主播(服务器)可以随时将最新的画面和声音推送给观众(客户端),而观众无需不断地刷新页面就能实时接收到这些信息。
相比于传统的轮询和长轮询机制,SSE 提供了一种更高效且实时的数据推送方式。传统的轮询就像是你不断地去问一个人有没有新消息,而长轮询则是你去问了之后,那个人如果没有新消息就一直等着你,直到有新消息了才回复你。这两种方式都比较浪费资源和时间。而 SSE 则是当有新消息时,服务器会主动推送给客户端,无需客户端不断地去询问。
SSE 是 HTML5 规范中的一个通信相关 API,它主要包含两个部分:服务端与浏览器端的通信协议(基于 HTTP 协议),以及浏览器端 JavaScript 可使用的 EventSource 对象。
SSE 运行在 HTTP 协议之上,它允许服务器以事件流(Event Stream)的形式将数据发送给客户端。客户端通过建立持久化的 HTTP 连接,并监听这个事件流,从而可以实时接收到服务器推送的数据。
SSE 具有以下几个主要特点:
(一)简单易用
SSE 使用基于文本的数据格式,如纯文本、JSON 等,这使得数据发送和解析都相对简单直接。就好比我们平时写日记,用的是大家都能看懂的文字,很容易理解和处理。
(二)单向通信
SSE 仅支持从服务器到客户端的单向通信。这意味着服务器可以主动推送数据给客户端,但客户端只能被动接收数据。比如电视台播放节目,观众只能接收电视台发送的信号,而不能反过来向电视台发送信号。
(三)实时性
由于 SSE 能够建立持久化连接,服务器因此可以实时地将数据推送给客户端,无需客户端频繁地发起请求。这大大提高了数据传输的效率和实时性。就像我们在看直播时,画面和声音几乎是同步的,不会有明显的延迟。
三、SSE 与 WebSocket 的比较
WebSocket 也是一种 Web 技术,用于实现实时双向通信,它与 SSE 在某些方面存在差异。
(一)数据推送方向
SSE 主要支持从服务器到客户端的单向通信,服务器可以主动地向客户端推送数据。
WebSocket 则支持双向通信,允许服务器和客户端之间进行实时的数据交换。例如,在聊天应用中,双方可以互相发送消息,这就需要双向通信。
(二)连接建立
SSE 利用基于 HTTP 的长连接,通过常规的 HTTP 请求和响应来建立连接,进而实现数据的实时推送。
WebSocket 采用自定义的协议,通过创建 WebSocket 连接来实现双向通信。
(三)兼容性
由于 SSE 基于 HTTP 协议,因此它可以在大多数现代浏览器中使用,并且无需进行额外的协议升级。
虽然 WebSocket 在绝大多数现代浏览器中也得到了支持,但在某些特定的网络环境下可能会遇到问题。
(四)适用场景
SSE 适合于需要服务器向客户端实时推送数据的场景,例如股票价格更新、新闻实时推送等。
WebSocket 则适合于需要实时双向通信的场景,如聊天应用、多人在线协作编辑等。
选择使用 SSE 还是 WebSocket 主要取决于具体的业务需求和场景。如果你只需要实现从服务器向客户端的单向数据推送,并且希望保持操作简便且兼容性好,那么 SSE 是一个理想的选择。然而,如果你需要实现双向通信,或者需要更高级的功能和控制,那么 WebSocket 可能会更适合你的需求。
【关联阅读】
关注公众号,回复【Java面试】,获取更多面试资料