借着ChatGPT的人机交互聊聊长连接

       ChatGPT这两年可谓风靡全球,尤其是最近Sora视频模型的横空出世以及claude 3模型所具备的浅意识,更是像打开了新世界的大门。本文就从ChatGPT的网页聊天开始聊起(有蹭热度之嫌,哈哈),聊聊长连接的发展历程和应用场景,文章尽量少说生涩的学术性的东西,就是瞎聊。本文也会简单聊聊自己曾经开发的电商客服系统以及个人网站是如何使用长连接的。

        先上个截图,看看ChatGPT使用的长连接:

        嗯,你没看错,ChatGPT由之前的SSE改成了Websocket,可不管用哪个,都使用到了长连接,最初ChatGPT使用SSE将计算得到的数据以流式的方式推送给客户端,不过网上很多文章还停留在2023年,今天我调试发现ChatGPT改用了Websocket。

一、长连接和短连接

        这两个不是什么新概念,短连接是每次请求都需要进行一次完整的TCP连接和释放;而长连接是多个请求可以复用同一个TCP连接,不必每次请求时都要重新建立连接,该请求结束后,也不会立即断开TCP连接。

       最早的HTTP/1.0默认都是短连接,后续引入了Keep-Alive,以及后续的HTTP/1.1,Http/2,Http/3都是默认长连接。短连接导致每次请求js,css,img这种静态文件时,每次都需要重新建立TCP连接进行请求,可想而知这种操作性能较差;后续的长连接就解决了这种问题。去年我们在处理生产事故时,一个系统使用了Nginx做反向代理,Nginx到Server使用的是短连接,导致在高并发时,出现了大量的TIME_WAIT,系统处理性能下降,并发量一直上不去,改成长连接之后,吞吐量立马就上来了。

        长连接几乎是所有系统的选择,比如我们所知道的RocketMQ的broker和consumer之间的长连接、Dubbo provider 与注册中心,provider和consumer,以及consumer与注册中心的长连接、游戏应用、聊天室、协作平台等等,都可以看到长连接的身影。

        Nacos也是在2.x版本开始引入了长连接,使得性能相比于1.x版本有了成倍数的提升。

c261d2dfc44440a1bb72001361c5abdc.png

二、长连接的实现方式

  1、HTTP Keep-Alive

        上面提到了,在HTTP/1.0时代,所有的连接都是短连接,这种低效的通信方式已经完全满足不了日益发展的实际业务需求了,因此后来引入了Keep-Alive(大家可以自行搜索与TCP的Keep-Alive的区别),长连接由此到来,HTTP/1.0,需要显示配置请求头的Connetion:Keep-Alive,而HTTP/1.1版本是默认支持的,如果Connection传close,就会关闭。当配置Nginx时,默认是http/1.0,就需要配置长连接,部分代码如下:

keepalive_requests 1000;

keepalive_timeout 60;


server {

    proxy_set_header Connection "";

    proxy_http_version  1.1;

}

2、WebSocket

      长连接只是提升基本性能的一种手段,如果希望能够实现即时通信,如服务端消息推送、聊天儿的话,就需要引入其他的方案。那最早的实现方式是客户端要主动轮询,轮询包括短轮询和长轮询(通常大家把短轮询就叫轮询,我为了区分就加个短字)。

        短轮询是不断地向服务器发送HTTP请求,有没有数据都直接返回,没有数据就再次发请求;长轮询(Comet)是向服务器发一次HTTP请求,如果服务端没数据就挂起请求,待到一定时间内还没有数据再返回。可见长轮询相比于短轮询有所改进的,减少了请求次数,但两者本质是一样的。这种经常性地发送HTTP请求势必造成了资源带宽的浪费,而且这也会造成同步的延迟。这突然让我想到了非阻塞IO,他也是不断发起系统调用询问数据有没有准备好,直到IO多路复用机制的出现才改变这种方式。

        那针对上面的问题,WebSocket可以较好地解决,Websocket是随着HTML5(html的版本,2008年正式发布)面世的。一经出现,广受好评和推广,这是因为其在技术上完全改变了过去的即时通信的实现方式,也大大提升了用户的使用体验。Websocket在客户端和服务端保持唯一的连接前提下,服务端可以主动把消息发给服务端,而且是全双工通信(全双工和半双工这两个算是通信领域的名词,他代表了我们通信的方式。全双工表示通信双方可以同时发数据;半双工是同一时刻只能有一方数据;还有一种叫单工,即只允许一个方向传数据,如广播电台)。

        现在我们经常看到的很多的网页聊天室,如电商平台的客服,基本上也都是通过Websocket的方式实现的。下面是真实的一个示意图:

        5c6370a9affe4540b0fe9ccddd51bfac.png

       之前在小米时,对接拼多多,拼多多的退款通知接口就是Websocket实现的,之所以这么做的原因就是用户在拼多多的退款申请通过后,拼多多会实时推送给小米有品,有品做后续的退款动作,避免因为定时轮询产生的延迟问题。对接过淘宝,京东的同学应该都知道,我们通常会通过定时轮询平台提供的接口同步订单和退款单,以便做后续的转单、发货或退款操作,但这种实现方式最大的问题就是存在延迟,有可能你都发完货了,才收到退款通知。下面是简单的示意图(注:wss是ws的安全版,类似于https和http的关系):

        ce903595c3e144c790544eda4bfcaa7e.png

        

        我画了一个Websocket连接建立的过程示意图:

adfb9112319b47c092eaf1c161d30ab7.png

        从上面流程图可以看到,Websocket的建立也要从HTTP协议开始的,这是因为浏览器为了统一不同的使用场景,第一次都会以HTTP协议进行通信,并不是说Websocket是基于HTTP,Websocket和HTTP都是应用层协议,两者互不隶属。

TCP报文:

GET /ws/chat/haibo/dhdwdwdnwdindo/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: Upgrade   //告诉浏览器,我要升级
Upgrade: websocket
Origin: http://127.0.0.1:8000
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Sec-WebSocket-Key: ++EcxfMKJZv5ZPzm/Ah0+Q==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

服务端:

HTTP/1.1 101 Switching Protocols  #101表示握手成功
Server: Daphne
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept: MDda/nVP5hymfRIxrEqsDeTXFTA=

.......9...h...9...z...f..{"message": "hello\uff1ahaha"}."{"message": "hello\uff1ahahatest"}..4WZj....HB!..(..un7g....;.......z.4SyV....

       Websocket具体的解释和字段含义这里不赘述,可参考标准:The WebSocket Protocol 。

        我前几年在写电商网站的时候,自己写了一个客服系统,用Python(django+channels)和LayIM实现的,先上图:

用户客服咨询:

d8780d63ac0e43c7b4fe7bd06992957f.png

客服端:

e82a616b9e0a466ebc3913154a23440c.png

F12可以看到其创建的Websocket,2201809314是用户id,每个用户创建了一个聊天室:

184355e7fc58444d993cd5667b00c9ec.png

其所发送的消息也都在连接上传递,双方也都可以主动发送消息(右侧红框里就是双方发送的消息):

703039e367eb44b1a01d90a9b610b4a7.png本文不展示具体代码,感兴趣的可以和我联系,我会免费提供代码。    

3、SSE

      SSE是基于HTTP协议的,这是和Websocket的不同点之一,而且他只能实现服务器到客户端的单向数据推送,不是双向通信的,这也是和Websocket的不同。SSE技术也是在ChatGPT中得到了应用,像淘宝的监控通知、股票的数据推送也都有用到,实时消息推送采用SSE也是一种较好的选择。

      这里展示一下demo的SSE请求和响应:

2c38cbaeae6c4cd58e3fa13f456619b5.png

数据推送:

a97a0041cbd34157a6f2fdba6769fc2a.png

4、Http/2

     http/2正式推出是2015年,想想也快10年了,目前基本上大家也都换成了http/2,其特点就是默认就是支持长连接,除此之外,还具备多路复用、二进制帧、头部压缩、服务器推送等优点,因此在性能上要甩出Http/1.x一大截,我在前两年也已经把自己的网站升级到http/2了,性能是肉眼可见的提升。

6d2cae1f85b94bb5a546063c4cb553de.png

dff333ab3ab94a41a3c2a586d331610b.png

       上面说到http/2既支持长连接,又支持服务端主动推送数据,那是不是就可以取代Websocket和SSE了呢?

        答案是不能,http2的服务端推送的定位就不一样,其目的是一次性提前将客户端可能请求的资源推送到客户端缓存,如js,css,img这种静态资源。诸如网页访问,数据首先会推送到浏览器缓存,当客户端发出请求时,直接从缓存中拿出请求数据即可。而Websocket实现的是实时的双方通信,SSE是服务器实时的流式推送。至少在一段时间内,Websocket和SSE是不会被淘汰的。

5、Http/3的QUIC

        好多人可能没听过QUIC协议,它是Http3所使用的协议,基于UDP实现的。是的,你没看错,未来的Http协议不再使用TCP,而是使用UDP协议,本文不讲述QUIC协议的原理,先说一个最大用处。

        我们在使用手机过程中,如果网络从移动网络切换到WIFI,或者WIFI切换到移动网络,往往会出现卡顿,卡顿时间不定。之所以出现这种现象是因为当前都是基于TCP连接的,一个TCP连接是由四元组组成的,包括源ip,目的ip,源port,目的Port,切换网络会导致源ip发生变化,需要重新建立连接。

6d4a4a8f5c2c49aea685bab2c8a1e3b5.png

        而QUIC协议规避了这点,两者可以创建连接id,类似于会话id,只要客户端和服务端双方设备id没有发生改变,就不会断线重新连接,这种好处就会大大提升用户的体验感。

7c7341df32b0435c970c32d9845c943d.png

 刚才我用wireshark抓了两个包:

 SCID(souce connection id) 、DCID(dest connection id):

08aed9f9dd7f4b29a897bc8400cf4b6a.png     

UDP:

a9b7421c84024860987e6fd1888b6ab4.png

        QUIC协议目前还没有大面积的推广,很多的客户端,如浏览器可能还不支持,但我相信不久的将来,QUIC一定会占据主要地位。

三、总结

        经济基础决定上层建筑,说的一点也不错。基础就是基石,基础决定了最终的高度,看似很基础的通信原理却影响着科技与生活的方方面面。说到这儿,我感觉挺悲哀的,当前计算机领域的基础建设都是欧美创造的,他们是Creator,而国内几乎所有人都是照搬过来,然后去做可以创造财富的应用,他们开发者想的是如何改变世界,我们则以利益为锚点,这就是价值观的不同。当然这并不是我们个人的错,是环境导致的,不搞钱,我们就得饿死。如今国内只有华为一家才真的可以与国外媲美,任正非曾经说过,“华为的理想是为了全世界服务”。我相信他说的话,如果他要是急功近利,就不用费尽周折大搞芯片研发,直接像其他设备商一样,买买买,然后上市圈钱就完了。

        今天早晨在读《认知驱动》这本书时,书中正好提到过,当你在做一件事时,不要太急功近利,而要多想一些利他的事,就像日本商业大神稻盛和夫,他在创造DDI之前一直在思考自己的想法是不是纯粹,是真的为了自己的国民,还是自己想出风头?经过半年的反省,他坚定了自己的信念,即他只考虑如何为国民利益着想,而不是为了自己,最后创造了蚍蜉撼大树的典范,吃掉NTT的一半市场,占据了半壁江山,他也真的为老百姓做出了贡献,降低了通讯资费。这个小故事想说,当你在做一件事时,如果考虑利他多余利己,那么你就会更加专心、更加耐心地去做它,直到成功,而成功后最终受益的还是自己,也就是说利他最终的结果一定还是利己。而国内这方面的欠缺也解释了为什么国内芯片领域如此薄弱,汉芯诈骗事件尤为深刻。

     希望华为能够掀起这股浪潮,让中国变得更加强大,也愿国家早日收复台湾,完成民族统一大业!!!

  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

13 OpenCv自定义线性滤波

文章目录 卷积算子示例 卷积 卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point) 把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚…

几种常见的python开发工具

​ Python是一种功能强大且易于学习的编程语言,被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛,越来越多的Python开发工具也涌现出来。但是,对于新手来说,选择一款合适的Python开发工具可…

vue3引入高德地图

首先注册高德key https://console.amap.com/dev/key/a vue项目中安转地图包 pnpm i amap/amap-jsapi-loader -S 先说最重要核心,踩雷过 页面中需写入以下代码,现在注册的高德key要求强制写入安全密钥 window._AMapSecurityConfig {securityJsCode…

9、字符串插入和删除

#include <iostream>using namespace std;void test01 () {string s "hello";s.insert (1, "111");cout << s << endl;s.erase(1, 3);cout << s << endl; }int main () {test01();return 0; } 总结&#xff1a; 插入和删除…

基于SVM模型的网络入侵检测模型训练与评估(NSL-KDD数据集)

简介 针对网络安全领域的NSL-KDD数据集进行分类任务的预处理和模型训练、以及超参数调优。 数据预处理 读取并解析数据集&#xff1b;检查并删除指定列&#xff08;outcome&#xff09;的缺失值&#xff1b;对类别型特征&#xff08;protocol_type, service, flag&#xff0…

Linux第73步_学习Linux设备树和“OF函数”

掌握设备树是 Linux驱动开发人员必备的技能&#xff01; 1、了解设备树文件 在3.x版本以前的Linux内核源码中&#xff0c;存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹&#xff0c;里面很多个“.c”和“.h”文件&#xff0c;它们用来描述设备信息。而现在的A…

深度学习与人类的智能交互:迈向自然与高效的人机新纪元

引言 随着科技的飞速发展&#xff0c;深度学习作为人工智能领域的一颗璀璨明珠&#xff0c;正日益展现出其在模拟人类认知和感知过程中的强大能力。本文旨在探讨深度学习如何日益逼近人类智能的边界&#xff0c;并通过模拟人类的感知系统&#xff0c;使机器能更深入地理解和解…

深空通信DTN总结

这里写自定义目录标题 A novel Federated Computation approach for Artificial Intelligence applications in Delay and Disruption Tolerant NetworksabstractintroductionDELAY AND DISRUPTION TOLERANT NETWORKS联邦计算用于容忍延迟和干扰的网络的联合学习框架DTN-ML Orc…

【视频图像取证篇】Impress模糊图像增强技术之颜色滤波器场景实例教程(蘇小沐)

【视频图像取证篇】Impress模糊图像增强技术之颜色滤波器场景实例教程&#xff08;蘇小沐&#xff09; Impress模糊图像增强技术之颜色滤波器场景实例教程—【蘇小沐】 1、实验环境 系统环境Impress&#xff0c;[v8.2.02]Windows 11 专业版&#xff0c;[23H2&#xff08;226…

犀牛7-软件基础设置

一、刚打开页面时&#xff0c;会弹出模板文件&#xff0c;一般我们选择小模型-毫米&#xff0c; 我们点击小模型-毫米之后&#xff0c;界面是这样的。 菜单栏&#xff1a;我们比较少使用&#xff0c;一般就用到创建文件。 命令栏(非常重要)&#xff1a;1、记录我们使用过的工…

httprunner参数化

1. 示例 引入对应的Parameters 1.1. CSV参数 from httprunner import HttpRunner, Config, Step, RunRequest, Parameters pytest.mark.parametrize("param", Parameters({"mobile_phone-pwd": "${P(csv_data/mobile_phone-pwd.csv)}"}))def …

项目解决方案:多地5G蓄能电站的视频监控联网系统设计方案

目 录 一、前言 二、系统架构设计 1、系统架构设计说明 2、系统拓扑图 三、关键技术 1. 5G支持技术 2. 视频图像处理技术 3. 数据融合与分析技术 四、功能特点 1. 高效可靠 2. 实时监测 3. 远程控制 4. 故障预测 五、应用前景 一、前言 随着能源…

讲讲 SaaS 平台的多租户设计

本篇就来讲讲 SaaS 平台的多租户设计。 以“钉钉”为例看实际的多租户场景 在讲设计之前&#xff0c;我们先以“钉钉”为例&#xff0c;来看看一个 SaaS 平台是如何运作的。相信大部分B 端产品经理都体验过钉钉&#xff0c;我们分两个维度来讲钉钉的租户注册到使用的流程。一…

w022郑州大学招新赛选拔赛

A-SW的与众不同数组_2022学年第一学期郑州大学ACM招新赛&选拔赛 (nowcoder.com) #include <bits/stdc.h> #define int long long using namespace std;void solve(){int n;cin >> n;vector<int> v;for(int i 1; i < n; i){int x;cin >> x;v.p…

导出谷歌gemma模型为ONNX

参考代码如下&#xff08;从GitHub - luchangli03/export_llama_to_onnx: export llama to onnx修改而来&#xff0c;后面会合入进去&#xff09; 模型权重链接参考&#xff1a; https://huggingface.co/google/gemma-2b-it 可以对modeling_gemma.py进行一些修改(transforme…

docker搭建dashdot

Dashdot 是一个指标收集工具&#xff0c;用于报告 Kubernetes 集群中的资源使用情况。假设你想要使用 Docker 来搭建 Dashdot&#xff0c;你需要制作或获取一个 Dashdot 的 Docker 镜像&#xff0c;然后可以通过 Docker CLI 命令或者使用 Docker Compose 来配置和运行这个容器。…

TinTin DESTINATION MOON|开发者不容错过的 Web3 线下活动来啦!

还记得去年 9 月 17 日的上海吗&#xff1f;「DESTINATION MOON: Web3 Dev Summit Shanghai 2023」迎来了数百名 Web3 行业爱好者的关注和参与。4 场主题演讲、3 场圆桌讨论&#xff0c;近 20 名创新者、开发者、投资人和研究员围绕公链生态、Layer2 竞争、DID、ZKP、安全等热点…

人工智能聊天机器人完整指南 - 推荐10家国外聊天机器人公司

人工智能&#xff08;AI&#xff09;聊天机器人革命正在向我们袭来。由对话式AI驱动的AI聊天机器正在改变企业世界&#xff0c;为公司提供更高效的方式与客户和员工互动。本综合指南将介绍AI聊天机器人&#xff0c;解释其主要功能和优势&#xff0c;并探讨它们如何改变您的业务…

3.8 动态规划 背包问题

一.01背包 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) 代码随想录 (programmercarl.com) 携带研究材料: 时间限制&#xff1a;5.000S 空间限制&#xff1a;128MB 题目描述: 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会…

使用docker安装运行rabbitmq---阿里云服务器

目录 0、阿里云没开端口的得要去安全组规则去添加&#xff1a; 1、下载RabbitMQ镜像&#xff1a; 2、查看镜像是否下载成功&#xff0c;得到docker镜像id&#xff1a; 3、运行RabbitMQ: 4、查看RabbbitMQ容器是否启动成功&#xff1a; 5、启动RabbitMQ中的插件管理 6、访…