ChatGPT对话为什么不用WebSocket而使用EventSource?

news2024/12/25 9:03:44

文章目录

    • 1. 引言
    • 2. WebSocket和EventSource简介
      • 2.1 WebSocket
      • 2.2 EventSource
    • 3. ChatGPT对话系统的特点
    • 4. EventSource的优势
      • 4.1 简单易用
      • 4.2 容错性强
      • 4.3 兼容性良好
    • 5. 为何选择EventSource而非WebSocket?
      • 5.1 单向通信模式
      • 5.2 长轮询模式
      • 5.3 简化部署和维护
    • 6. 使用EventSource的代码示例
      • 6.1 服务端实现
      • 6.2 客户端实现
    • 7. 性能考量与拓展
      • 7.1 性能考量
      • 7.2 拓展可能性
    • 8. 总结

在这里插入图片描述

🎉ChatGPT对话为什么不用WebSocket而使用EventSource?


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:AIGC人工智能
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

1. 引言

在构建基于浏览器的实时对话系统时,开发者通常会选择使用WebSocket作为实现实时通信的协议。然而,有些场景下,使用EventSource作为替代方案也是一个值得考虑的选择。本文将深入探讨为什么ChatGPT对话系统选择使用EventSource而非WebSocket,并通过代码示例和详细解释,帮助读者理解这一决策的原因。
在这里插入图片描述

2. WebSocket和EventSource简介

2.1 WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议,它允许在客户端和服务器之间进行实时的双向数据传输。WebSocket通过一个持久的连接,使得服务器能够主动向客户端推送数据,而不需要客户端发起请求。

2.2 EventSource

EventSource是HTML5引入的一种轻量级的、基于文本的协议,用于从服务器推送事件。与WebSocket不同,EventSource建立在HTTP协议之上,使用了单向的服务器推送。它允许服务器发送事件到客户端,但客户端只能接收而不能发送。

3. ChatGPT对话系统的特点

ChatGPT对话系统作为一个浏览器端的实时对话应用,具有以下特点:

  • 单向通信: ChatGPT对话系统是用户向模型发送消息,模型回复消息的单向通信模式。
  • 长轮询: 对于模型的回复,ChatGPT通常使用长轮询等待模型的响应。

4. EventSource的优势

4.1 简单易用

EventSource相对于WebSocket而言更为简单易用。它建立在HTTP协议之上,无需进行握手等复杂的初始化过程。在浏览器端,使用EventSource只需要创建一个EventSource对象并指定服务器的URL即可。

4.2 容错性强

EventSource具有良好的容错性。当连接断开时,它会自动尝试重新连接,而不需要开发者手动处理重新连接的逻辑。这使得在不稳定的网络环境中,EventSource更为可靠。

4.3 兼容性良好

相对于WebSocket,EventSource在浏览器的兼容性方面更有优势。绝大多数现代浏览器都原生支持EventSource,而WebSocket则需要额外的处理以兼容一些旧版本的浏览器。

5. 为何选择EventSource而非WebSocket?

ChatGPT对话系统之所以选择EventSource而非WebSocket,主要是基于以下考虑:

5.1 单向通信模式

由于ChatGPT对话系统是用户向模型发送消息,模型回复消息的单向通信模式,WebSocket的双向通信能力并没有被充分利用。使用WebSocket会引入不必要的复杂性,而EventSource更符合ChatGPT对话系统的通信需求。

5.2 长轮询模式

ChatGPT通常使用长轮询等待模型的回复,而EventSource天然支持这种模式。WebSocket在这种场景下并没有显著的优势,反而会增加额外的复杂性。

5.3 简化部署和维护

使用EventSource可以简化部署和维护工作。由于EventSource建立在HTTP协议之上,无需考虑WebSocket的握手和心跳等复杂机制,使得整体系统更加简洁。

6. 使用EventSource的代码示例

6.1 服务端实现

在服务端,使用Node.js和Express框架作为演示:

const express = require('express');
const { v4: uuidv4 } = require('uuid');

const app = express();
const port = 3000;

const clients = new Map();

app.get('/events', (req, res) => {
  const clientId = uuidv4();
  const newClient = res;
  clients.set(clientId, newClient);

  req.on('close', () => {
    clients.delete(clientId);
  });

  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');
  res.flushHeaders();

  clients.forEach((client) => {
    client.write(`data: A new user joined!\n\n`);
  });
});

app.post('/send-message', express.json(), (req, res) => {
  const { message } = req.body;

  clients.forEach((client) => {
    client.write(`data: ${message}\n\n`);
  });

  res.status(200).send('Message sent successfully!');
});

app.listen(port, () => {
  console.log(`Server is listening at http://localhost:${port}`);
});

6.2 客户端实现

在浏览器端,使用JavaScript:

const eventSource = new EventSource('http://localhost:3000/events');

eventSource.onmessage = (event) => {
  const message = event.data;
  console.log(`Received message: ${message}`);
};

document.getElementById('sendMessageBtn').addEventListener('click', () => {
  const message = prompt('Enter your message:');
  fetch('http://localhost:3000/send-message', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ message }),
  });
});

在上述代码中,客户端通过EventSource建立与服务器的连接,并监听onmessage事件处理服务器发送的消息。用户可以通过点击按钮发送消息,服务器将消息广播给所有连接的客户端。

7. 性能考量与拓展

7.1 性能考量

在性能方面,WebSocket通常更为高效,因为它建立在TCP连接上,具有低延迟和高吞吐量的特性。然而,对于一些实时性要求不高或者场景较为简单的应用,EventSource的性能已经足够满足需求,并且其简洁性更加符合一些特定场景的需求。

7.2 拓展可能性

ChatGPT对话系统可以考虑在未来的版本中增加对WebSocket的支持,以应对一些需要更低延迟、更高实时性的场景。通过在系统中引入灵活的通信机制,可以更好地满足不同用户和应用的需求。

8. 总结

本文深入探讨了为什么ChatGPT对话系统选择使用EventSource而非WebSocket。通过对WebSocket和EventSource的简介、ChatGPT对话系统特点以及EventSource的优势进行分析,我们发现在特定场景下,选择EventSource能够更好地满足应用需求,简化部署和维护工作。最后,通过代码示例展示了如何在ChatGPT对话系统中使用EventSource实现实时通信,并对性能考量和拓展可能性进行了讨论。在实际应用中,开发者可以根据具体需求选择最适合的通信方式,以提供更好的用户体验和系统性能。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

后端接受List类型参数报错:Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token

今天和前端调接口时报了"Cannot deserialize instance of java.util.ArrayList out of START_OBJECT token"错误 其实我想要的是这种类型的参数 但是前端传的是这种类型 前端传过来的更像是一个对象而不是一个列表,我们后端不能直接接受它 报错时后端的…

CSS特效030:日蚀动画

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

郝斌C语言自学教程笔记

赫斌C语言——笔记目录 c语言编程预备知识流程控制函数变量指针结构体位运算符 前段时间康哥看我C语言基础不牢,推荐我学习郝斌老师的C语言课程,花2周看完之后发现确实是目前所看的C语言课程中最好的,不仅非常适合入门,而且对即使学了几年C语…

痤疮分割 实验心路历程

数据集的制作 将labelme生成的标注文件记普通的json文件转成coco数据集格式的json文件 图像分辨率过大 如果不做任何调整: 会出现“killed”的报错,表示图片像素过大,显卡内存不够,无法支撑训练 显卡 换成更高性能的显卡&am…

配置VRRP负载分担示例

一、组网需求: HostA和HostC通过Switch双归属到SwitchA和SwitchB。为减轻SwitchA上数据流量的承载压力,HostA以SwitchA为默认网关接入Internet,SwitchB作为备份网关;HostC以SwitchB为默认网关接入Internet,SwitchA作为…

快速入门Tailwind CSS:从零开始构建现代化界面

快速入门Tailwind CSS:从零开始构建现代化界面 介绍 Tailwind CSS 是一个以原子类的方式快速构建界面的 CSS 框架。它提供了丰富的预定义类,使得开发者能够快速构建样式和布局。 安装和设置 首先,我们需要在项目中安装 Tailwind CSS。可以…

经典深度学习算法【1】:K-近邻算法(KNN)概述

最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多个训练…

【Java】线程池的创建

目录 ​编辑 一、什么是线程池 二、创建和使用 导入必要的包: 创建线程池: 提交任务给线程池执行: 自定义Runnable和Callable任务: 关闭线程池: 我的其他博客 一、什么是线程池 在Java中,线程池是…

phpy 连接 PHP与Python生态 跨界合作 PHPY搭建 已解决

目录 需求介绍 安装 windows版本 文件地址 运行效果 需求介绍 在日常功能开发中,难免会使用python的计算库,同时自己要是一名PHP开发工程师。就在最近有相应的需求,索性使用phpy来进行功能开发 安装 windows版本 phpy 是识沃团队最新推出…

系列三、DDL

一、DDL 1.1、概述 DDL是英文单词Data Definition Language的缩写,中文意思为数据定义语言,是用来定义数据库对象(数据库,表,字段)的。 1.2、数据库操作 1.2.1、查询所有数据库 show databases; 1.2.2、创建数据库 # 语法 cre…

TrustZone之安全虚拟化

在Armv7-A首次引入虚拟化时,它仅在非安全状态中添加。在Armv8.3之前,Armv8也是如此,如下图所示: 如前所述在切换安全状态时,EL3用于托管固件和安全监视器。安全EL0/1托管受信任的执行环境(TEE),由受信任的服务和内核组成。 在安全状态下,没有对多个虚拟机的需…

IntelliJ IDEA无公网环境远程访问Linux服务器进行开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

01-进程和线程的概述

进程和线程的相关概念 概述 进程是一个运行中的应用程序,一个进程是一个执行中的软件 每打开一个软件就相当于启动了一个进程 , 操作系统就会为该进程分配一个内存空间, 进程A和进程B的内存独立不共享 线程是由进程创建的,一个进程可以启动多个线程,线程是一个进程中的执行…

AI 在智能制造:推动创新与效率的提升

AI在智能制造中的应用,正在不断推动着智能制造的发展,为制造业带来巨大的创新和变革。 随着AI科技的不断创新发展,人工智能(AI)在许多领域都取得了显著的进步,其中之一就是智能制造。智能制造是指通过集成…

Vue3-17-ref 模板引用的基本使用

什么是模板引用 简单来说,就是在 js 代码中 获取到 html 中的dom元素的完整信息, 从而实现直接操作dom元素的效果。模板引用的语法 1、给 dom 元素添加 ref名称 属性,指定一个独有的名称; 2、js 中 声明一个 与 dom 元素的 ref 同…

Linux--fork创建子进程详解

目录 一.初识fork函数 二.fork的返回值 三.fork原理 1.fork是如何创建子进程的? 2.为什么fork会有两个返回值? 3.为什么父进程的返回值是子进程的pid,子进程返回值是0? 4.fork之后,父子进程谁先运行?…

SpringBoot2初始入门

适配器 任务调度 父项目、webstarter、bulid 版本管理 自动配置 Spring、SpringMVC 扫描包:主程序及其子包 底层注解: Configuration、Bean 单实例 proxyBeanMethodstrue,组件依赖 Import Conditioal(name"")条件…

访问修饰符

1.java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围)。 1.公开级别:用public修饰,对外公开 2.受保护级别:用protected修饰,对子类和同一个包中的类公开 3.默认级别:没用修饰符,向同一个包的类公开 4.私有级别:用private修饰,只有本类可以访问,不…

智能优化算法应用:基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.模拟退火算法4.实验参数设定5.算法结果6.…

如何处理好面试中的“压力测试”?

作为一名求职者,在面试时有时遇到的是压力测试,有时则遇到的是一些无良企业单位,究竟如何把握忍耐的限度,才合格当一个能经受压力的员工,才能避免对无良单位的一味隐忍! 压力面试是指有意制造紧张,以了解求…