长连接:ChatGPT流式响应背后的逻辑
提起长连接,我们并不陌生,最常见的长连接非websocket莫属了。即使没有在项目中实际用过,至少也应该有所接触。长连接指在一次网络通信中,客户端与服务器之间建立一条持久的连接,可以在多次请求和响应中重复使用该连接。这种方式的优点是减少了连接建立和关闭的开销,提高了通信效率,但需要注意控制连接的数量,避免资源浪费。短连接则是每次请求和响应都建立一个新的连接,完成后立即关闭,需要频繁进行连接建立和关闭,效率相对较低。但是这种方式更加灵活,适用于请求量较小、请求频率不高的场景。
二、背景:最近项目在引用ChatGPT智能小助手,最开始采用的是当ChatGPT回答完成后一次性返回答案。但这种方式受限于网络及服务较慢的原因导致用户需要等待较长时间,极大的降低了用户的使用体验。经过项目组成员商议决定采取答案逐字返回的形式,以便于用户能更快的得到反馈。
(资料图片仅供参考)
关于长连接技术,主要考虑两种方案websocket和sse
三、原理:1.websocket概念:WebSocket是HTML5定义的新协议,实现了服务器与客户端之间的全双工通信。WebSocket连接一旦建立,客户端和服务器端处于平等地位,可以相互发送数据,不存在请求和响应的区别。
2、websocket优劣势:优势在于实现了双向通信,劣势在于服务器端的逻辑非常复杂。现在针对不同的后台语言有不同的插件可以使用。
3、sse概念:SSE(Server-Sent Events)是HTML5新增的功能,允许服务器将数据推送到客户端。与长轮询和短轮询不同,SSE不需要客户端先发送请求,而是在服务器端数据有更新时立即发送到客户端
4、sse优劣势:优势在于节约资源,提升应用性能。SSE可以实现只要服务器端数据有更新,就可以马上发送到客户端,不需要建立或保持大量的客户端发往服务器端的请求。另外,SSE的实现非常简单,并且不需要依赖其他插件。劣势在于不是双向通信,只能后台向前台推送。
5、相同点:都是基于tcp,都是可靠的传输协议
6、不同点:
WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息HTTP是单向的WebSocket是需要浏览器和服务器握手进行建立连接的而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接四、应用:1、sse在chatgpt中的应用前端代码
import { fetchEventSource } from "@microsoft/fetch-event-source"let answerContent = ""fetchEventSource("/chatgptApi/chatgpt_qa_stream", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ messages }), async onopen(response) { if (response.ok && response.status === 200) { console.log("连接成功") } else { console.log("连接异常") } }, async onmessage(event) { // 表示整体结束 if (event.data === "[DONE]") { console.log("结束") return } if (event.data) { const data = JSON.parse(event.data) answerContent += data.content } }, async onerror(error) { console.error("Error:", error) }, async onclose() { console.log("关闭连接") } })
后端代码
const http = require("http");const yun = express();const eventServer = http.createServer((req, res) => { res.writeHead(200, { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type,Content-Length,Authorization,Accept,X-Requested-With", "Access-Control-Allow-Methods": "PUT,POST,GET,DELETE,OPTIONS" }); setInterval(() => { // 事件要用两个\n结束 res.write("data: The server time is: " + new Date() + "\n\n"); }, 1000); req.connection.addListener("close", () => { console.log("SSE connection closed!"); }, false);}).listen(4001);
2、websockt在即时聊天中的应用前端代码
// 创建WebSocket对象let ws = new WebSocket("ws://localhost:8888")// 连接成功后的回调函数ws.onopen = function (params) { console.log("客户端连接成功") // 向服务器发送消息 ws.send("hello")};// 从服务器接受到信息时的回调函数ws.onmessage = function (e) { console.log("收到服务器响应", e.data)};// 连接关闭后的回调函数ws.onclose = function(evt) { console.log("关闭客户端连接");};// 连接失败后的回调函数ws.onerror = function (evt) { console.log("连接失败了");};// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,这样服务端会抛异常。window.onbeforeunload = function() { ws.close();}
后端代码
/ 引入插件const ws = require("nodejs-websocket")// 只要有用户链接,函数就会执行,会给当前链接的用户创建一个connect对象const server = ws.createServer((connect)=>{ console.log("连接成功") // console.log(connect) // 注册text事件 ,接收用户传递过来的数据 connect.on("text",data=>{ console.log("接收客户端数据---->", data) // 给所有用户发送消息 broadcast(server,data+"--返回数据") }) // 连接断开,触发事件close connect.on("close",()=>{ console.log("用户链接断开--close") }) // 用户链接断开 connect.on("error",err=>{ console.log("err", err) })}).listen(3001,()=>{ console.log("websocket服务启动成功了")})// 给所有人发消息function broadcast(server,msg){ server.connections.forEach(element => { element.send(msg) });}
五、效果:sse在chatgpt案例中的应用
作者:京东物流 田雷雷
来源:京东云开发者社区 自猿其说Tech
-
长连接:ChatGPT流式响应背后的逻辑
京东云开发者社区 自猿其说Tech 责任编辑:武晓燕 2023-08-09
-
人民币兑美元中间价报7.1588,调贬23个基点
金融界 2023-08-09
-
央行今日进行20亿元7天期逆回购操作
国际金融报网 2023-08-09
-
国内商品期市早盘涨跌不一 尿素、玻璃涨超2%
中国证券网 2023-08-09
-
苹果 watchOS 10 全新世界时钟应用初步上手
IT之家 2023-08-09
-
山子股份08月08日被深股通减持19.33万股
东方财富Choice数据 2023-08-09
-
区域协调发展新看点丨成都向东、重庆向西,两地合作之路越走越宽广
腾讯网 2023-08-09
-
养老产业板块8月8日跌0.14%,云南城投领跌,主力资金净流出2.63亿元
证券之星 2023-08-09
-
“一年心血被洪水糟蹋”,她强忍泪水的求救终于上热搜了
东方资讯 2023-08-09
-
黄油饼干专卖 黄油饼干
互联网 2023-08-08
-
长连接:ChatGPT流式响应背后的逻辑
京东云开发者社区 自猿其说Tech 责任编辑:武晓燕 2023-08-09
-
人民币兑美元中间价报7.1588,调贬23个基点
金融界 2023-08-09
-
央行今日进行20亿元7天期逆回购操作
国际金融报网 2023-08-09
-
国内商品期市早盘涨跌不一 尿素、玻璃涨超2%
中国证券网 2023-08-09
-
苹果 watchOS 10 全新世界时钟应用初步上手
IT之家 2023-08-09
-
山子股份08月08日被深股通减持19.33万股
东方财富Choice数据 2023-08-09
-
区域协调发展新看点丨成都向东、重庆向西,两地合作之路越走越宽广
腾讯网 2023-08-09
-
养老产业板块8月8日跌0.14%,云南城投领跌,主力资金净流出2.63亿元
证券之星 2023-08-09
-
“一年心血被洪水糟蹋”,她强忍泪水的求救终于上热搜了
东方资讯 2023-08-09
-
黄油饼干专卖 黄油饼干
互联网 2023-08-08
-
《名侦探皮卡丘 闪电回归》10月6日登陆Switch
3DM整理 2023-08-08
-
记者:西汉姆继续谈马奎尔&麦克托米奈转会,前者更接近达协议
互联网 2023-08-08
-
hotmail 登录(hotmail登入)
互联网 2023-08-08
-
康冠科技:面板价格上升的趋势短时间内可能还会持续
证券时报·e公司 2023-08-08
-
两老头为抢舞伴,当众耍流氓!一人因情绪激动死亡,家属索赔百万
客馆历史 2023-08-08
-
长三角地区发布“健身合同示范文本”
新华网 2023-08-08
-
糖果大富翁官网在哪下载 最新官方下载安装地址
九游网 2023-08-08
-
天然气输送管道用钢L485(X70)冲击功
个人图书馆-舞钢洪锋 2023-08-08
-
20多家沿街门店被盗,惠济警方抓获“黑夜暗影”
郑州日报 2023-08-08
-
云南德宏一村寨发生山体滑坡3人被困 其中1人获救2人遇难
央视新闻客户端 2023-08-08
-
环旭电子最新公告:7月合并营业收入为50.36亿元 同比减少10.76%
证券之星 2023-08-08
-
被诉“串谋欺骗美国”,特朗普支持率不降反升
中国青年报客户端 2023-08-08
-
8月8日安徽八斗氯化钾价格暂稳
生意社 2023-08-08
-
今年第7号台风“兰恩”生成 具体是什么情况?
城市网 2023-08-08
-
玛拉胶带的质量检测和故障排除
哔哩哔哩 2023-08-08
-
一家四口被残忍杀害 掩埋30多年灭门血案告破!凶手被抓!
腾讯网 2023-08-08
-
浙江台州军营“枪王成长记”:用汗水浇筑不凡
中国新闻网 2023-08-08
-
海关总署15条举措支持西部陆海新通道建设
中国青年网 2023-08-08
-
WiFi万能钥匙携亿级流量免费注入助力小微搭建在线通路
永州新闻网 2023-08-08
-
四川巴中恩阳区:公积金贷款首付最低下调至20%
财联社 2023-08-08