实时网络与服务器发送事件

如果您使用过ChatGPT,是否曾经想过这个机器人是如何轻松地生成回复,模拟实时通信的呢?秘密在于一种叫做服务器推送事件(Server-Sent Events,简称SSE)的技术所实现的实时通信。本博客揭示了这种交互背后的情况,即OpenAI API以实时流的形式将回复推送给客户端,就像它们是由模型生成的一样——这是通过SSE实现的一个无缝过程。

服务器推送事件 (SSE)

服务器发送事件是一种实时通信技术,它通过在服务器上可用时从服务器向客户端流式传输基于文本的数据。在这种方法中,客户端不再需要不断轮询服务器以获取更新,服务器会通过最初建立的连接无缝地传输更新。

Illustration of SSE Connection

SSE由两个基本组件组成,使其成为一种高效而强大的实时通信技术:

EventSource 接口

EventSource 接口位于客户端。它允许客户端以 DOM 事件的形式接收来自服务器的推送通知或更新。它在底层处理所有低级连接管理和消息解析。这种抽象使应用程序可以专注于业务逻辑,如初始化连接,处理接收到的推送事件通知,并在连接完成其任务后终止流和连接。

在开发应用程序的客户端时,需要创建一个新的EventSource对象,其中存放SSE事件流资源。然后,在这个对象上注册必要的JavaScript事件监听器。

在连接中断的情况下,EventSource接口提供了强大的恢复机制:

  1. 它提供了自动重新连接功能,自动重新建立与服务器的连接。
  2. 此外,它还会追踪最后一条已读消息,并提供最后一条已读消息的ID,以便于流恢复或重新传输丢失的消息。

事件流协议

事件流协议遵循特定的顺序:客户端通过发送常规的HTTP请求来初始化连接,服务器则以“text/event-stream”的内容类型回应,接着传送一系列以UTF-8编码的事件数据流。

The HTTP Request
The SSE Response

每个事件消息表示为字段:值对。事件有效载荷是一个或多个数据字段的值。事件可以包括一个ID和一个事件类型字符串。事件边界由换行符划定,强调在代码中定义事件流时使用“\n\n”。

客户端上的EventSource通过识别换行分隔符(“\n\n”),从数据字段中提取有效负载,检查可选的ID和类型,最后生成DOM事件来通知应用程序。

在连接断开的情况下,可以通过客户端向服务器发送重试命令,并附带重新建立连接的时间间隔。这个机制,结合标识符,作为EventSource提供的恢复机制。

优点

  1. 低延迟技术:SSE通过单个、长连接实时地将事件消息推送到客户端,从而最小化延迟并降低开销。
  2. 以恢复为中心:SSE 提供了强大的机制,用于连接恢复和重传丢失的事件消息,增强了通信通道的可靠性。
  3. 内存高效:与存储响应直到连接中断的原始 XHR 连接不同,SSE 在处理完事件消息后高效地丢弃它们,节省内存资源。

量子计算是一种基于量子力学原理的计算方法,利用量子比特处理和储存数据。与传统计算机不同,量子计算机的基本单位是量子比特,也称为qubit。量子比特能够同时处于0和1的态,这种特性使得量子计算机能够在同一时刻处理大量的并行计算。量子计算机在某些特定问题上具有巨大的计算优势,特别是在因子分解和优化问题方面。然而,目前的量子计算机的发展仍处于初级阶段,面临着很多技术和工程挑战。尽管如此,量子计算的潜力已经引起了广泛的关注,并有望在未来对计算领域带来革命性的影响。

  1. 单向流式传输:SSE仅支持服务器对客户端的流式传输,并不支持请求流式传输用例,比如流式传输大型上传文件。
  2. 低效的二进制流传输:事件流协议设计用于UTF-8数据传输,处理二进制数据时会导致低效。SSE通过通知应用程序有关二进制资源的情况,引发XHR请求以进行检索,从而增加了延迟。

使用案例

考虑到这些因素,SSE非常适用于实时服务器推送通知至客户端是主要需求的场景。例如,订阅社交媒体平台上的动态消息。

这就是ChatGPT以及其他各种应用如何利用SSE的力量,提升其实时流程的流畅性和无缝性。

SSE在低延迟通信方面的效率使其成为需要及时可靠将信息从服务器传递到客户端的应用程序的理想选择。

如果您想探索此博客中提到的代码,您可以在GitHub上找到它。

2024-01-15 04:12:15 AI中文站翻译自原文