ChatGPT逐字推送的秘密

简介: ChatGPT逐字推送的秘密

背景

面试官: 最近ChatGPT很火,他以聊天的形式把答案推送给你,你知道服务器逐字主动推送怎么做的吗?

了不起: 可以用Websocket协议来推送。

面试官: 还有其他方式吗?

了不起: 目前只知道这个

SSE协议

SSE(Server-Sent Events)是一种基于HTTP的服务器向客户端推送数据的机制。与WebSocket相比,SSE更加轻量级,适用于需要实时更新的Web应用程序。其通讯过程如下:

  1. 客户端向服务器发送一个HTTP请求,请求一个SSE连接。
  2. 服务器接受请求,返回一个HTTP响应,状态码为200 OK,并设置Content-Type为text/event-stream。
  3. 服务器将一系列事件发送到客户端。每个事件包含一个或多个字段,包括事件名、数据和可选的ID。这些事件通过HTTP响应的正文部分发送。
  4. 客户端通过持续连接保持连接打开,并接收服务器发送的事件。每个事件都以一个“data:”字段开头,后面跟着实际的数据。如果事件包含事件名称,则其名称以“event:”字段开头。如果事件包含ID,则其ID以“id:”字段开头。
  5. 客户端可以通过JavaScript代码监听SSE事件,以便在事件到达时执行某些操作。例如,可以使用EventSource对象的onmessage回调函数来处理收到的消息。
  6. 如果客户端希望关闭连接,可以发送一个HTTP请求,其中包含“Connection: close”头部。服务器将关闭连接,并停止向客户端发送事件。

代码实现

SseEmitter是一个Spring框架中的类,用于实现服务器发送事件(Server-Sent Events)的功能。它允许服务器向客户端发送一系列的数据,而无需客户端不断地发送请求。以下是使用SseEmitter实现的步骤:

  1. 创建一个SseEmitter对象,该对象将用于向客户端发送事件。
  2. 在SseEmitter对象上注册一个CompletionCallback,以便在SseEmitter关闭时执行一些操作。
  3. 在SseEmitter对象上调用send()方法,向客户端发送数据。
  4. 在需要时可以调用complete()方法或completeWithError()方法,以结束SseEmitter并关闭连接。

例如,以下代码演示了如何在Spring MVC中使用SseEmitter发送一个简单的消息:SseEmitter是一个Spring框架中的类,用于实现服务器发送事件(Server-Sent Events)的功能。它允许服务器向客户端发送一系列的数据,而无需客户端不断地发送请求。以下是使用SseEmitter实现的步骤:

  1. 创建一个SseEmitter对象,该对象将用于向客户端发送事件。
  2. 在SseEmitter对象上注册一个CompletionCallback,以便在SseEmitter关闭时执行一些操作。
  3. 在SseEmitter对象上调用send()方法,向客户端发送数据。
  4. 在需要时可以调用complete()方法或completeWithError()方法,以结束SseEmitter并关闭连接。

例如,以下代码演示了如何在Spring MVC中使用SseEmitter发送一个简单的消息:

@GetMapping("/stream")
public SseEmitter stream() {
  SseEmitter emitter = new SseEmitter();
  try {
    emitter.send("Hello, world!");
    emitter.complete();
  } catch (IOException e) {
    emitter.completeWithError(e);
  }
  return emitter;
}

在这个例子中,我们创建了一个SseEmitter对象,并向客户端发送了一条消息。然后,我们调用了complete()方法,以结束SseEmitter并关闭连接。如果在发送消息时发生了任何错误,我们将调用completeWithError()方法,以关闭连接并抛出异常。

对比Websocket

SSE(Server-Sent Events)和Websocket都是用于实现服务器和客户端之间实时通信的技术,但它们有不同的优缺点,如下所述:

SSE的优点:

  1. SSE是基于HTTP协议的,因此可以穿透大多数防火墙和代理服务器。
  2. SSE可以使用普通的HTTP服务器,无需额外的服务器软件。
  3. SSE是单向通信,只能由服务器向客户端发送数据,因此可以减少带宽和资源使用。
  4. SSE支持自定义事件和数据格式。

SSE的缺点:

  1. SSE只能使用长轮询或短轮询方式实现,因此无法实现真正的实时通信。
  2. SSE不支持双向通信,因此无法实现客户端向服务器发送数据。
  3. SSE在某些浏览器中可能存在兼容性问题。

Websocket的优点:

  1. Websocket是双向通信的,可以实现真正的实时通信。
  2. Websocket支持服务器向客户端和客户端向服务器发送数据。
  3. Websocket使用单个TCP连接,因此可以减少网络延迟和带宽使用。
  4. Websocket是一种标准化的协议,具有良好的跨平台和跨浏览器支持。

Websocket的缺点:

  1. Websocket需要额外的服务器软件支持,例如Socket.io等。
  2. Websocket的初始连接开销较大,需要经过握手过程。
  3. Websocket在某些防火墙和代理服务器中可能存在问题。

总结

ChatGPT 采用 Server-sent events(SSE)协议,是因为 SSE 提供了一种简单、可靠、高效的服务器推送技术,可以实现实时通信,而且不需要客户端发起请求,可以节省带宽和服务器资源。

SSE 是一种基于 HTTP 协议的服务器推送技术,它允许服务器向客户端发送单向的、实时的、持久的数据流,而客户端只需要通过一个简单的 EventSource 接口进行监听和处理即可。SSE 的优点在于它不需要客户端发起多余的请求,而是通过一个长连接,实现了服务器向客户端的数据推送,避免了频繁的 HTTP 请求,减少了网络延迟和带宽消耗,能够更好地适应实时通信的场景。

因此,ChatGPT 采用 SSE 协议,可以更加高效地推送消息,提高了实时性和用户体验。


相关文章
|
9月前
|
API Python
有效电子邮件地址是怎么样的?如何用代码筛查
有效电子邮件地址是怎么样的?如何用代码筛查
|
9月前
|
人工智能 自然语言处理 算法
小心 !ChatGPT可能正在偷走你的数据!
小心 !ChatGPT可能正在偷走你的数据!
82 0
|
9月前
|
人工智能 缓存 自然语言处理
ChatGPT消息发不出去?ChatGPT没反应?那是这个步骤少做了!
今天在工作的过程中,我正准备登陆ChatGPT咨询一些关于文案的问题,但突然发现自己无法发送消息了。 “ChatGPT消息发送故障,但历史对话仍可查看。为了解决问题,您可以先访问OpenAI官方网站:https://status.openai.com/。 这个网站提供了Open AI系统的实时状态监控,非常方便实用。”
222 0
ChatGPT消息发不出去?ChatGPT没反应?那是这个步骤少做了!
|
存储 安全 网络协议
探寻未知:揭秘子域名收集的秘密艺术
探寻未知:揭秘子域名收集的秘密艺术
152 0
|
存储 编解码 运维
让数据说话,获得“原来如此”的答案
随着数据分析和人工智能技术的快速发展,让数据说话已经成为了一种新的趋势。数据不仅可以帮助我们发现问题,解决问题,还可以让我们获得“原来如此”的答案。尤其是在日常生活中,数据无处不在,而且我们生活中的点点滴滴都脱离不了数据,通过数据可以知道自己的消费情况,通过数据可以知道自己喜欢的电影类型,通过数据可以知道自己在日常工作中的任务进度,等等这些通过数据分析和洞察,可以让某些困惑“真相大白”。
204 0
|
人工智能 移动开发 自然语言处理
如何让 ChatGPT 读懂超长保险条款?
如何让 ChatGPT 读懂超长保险条款?
531 1
如何用ChatGPT做书籍、报告、文件的读取与互动式问答?故事人物活起来
该场景对应的关键词库(15个): 书籍、报告、文件、详细信息、查询、主题、作者、出版日期、出版社、问题、方面、原则、方法、概括、主要观点、解释。
208 0
|
人工智能 自然语言处理 搜索推荐
ChatGPT 中文指令指南,教会你如何使用chatgpt实现中文你想要的答案
ChatGPT 中文指令指南,教会你如何使用chatgpt实现中文你想要的答案
|
存储 网络协议 数据安全/隐私保护
邮件传输的过程都看不懂。那我走(狗头)
给学习网络的新手一个我自己总结的建议: 我觉得学网络先要先把最基础最常用的协议的原理搞的明明白白,然后再学习难的协议或者是拓展的协议就好理解容易上手了。
260 0
邮件传输的过程都看不懂。那我走(狗头)
|
存储 安全 机器人
关于机器人流程自动化 不可不知的十个秘密
机器人流程自动化工具通过添加可智能处理旧代码和有助于延长其使用期限的新图层,为遗留系统赋予了新的生命。许多机器人流程自动化工具还可以由非编程人员来部署,从而使那些使用旧工具感到苦恼的人能够通过拖放新图标来改善其工作流程。通过选择恰当的工具和实现方法,任何能够编写电子表格宏的人都可以使用机器人流程自动化来简化工作流程。但在机器人流程自动化为您的系统带来的这些好处背后,还隐藏着一些问题,随着时间的推移,这些问题可能会带来麻烦。
202 0