异步http和同步http原理和差异

news2024/11/15 17:29:08

开发服务器端程序时,一种常见的需求是,通过向另一个http服务器发送请求,获得数据。最常规的作法是使用同步http请求的方式,过程如下

这种方式简单好用,但是在高并发场景下有缺陷。在单线程环境下,程序发送http请求是串行的,也就是第一个请求未完成的情况下,第二个请求发不出去,就像一条单行车道,车子只能一辆一辆的过。 为此我们会引入多线程提高并发性,然而多线程对并发发送http请求的提升也是有限的,比如8个线程同时只能发送8个请求,假如每个请求从发送到得到结果的时间是1秒,那么8个线程每秒钟也只能发送8个请求,而线程不能无线多开,因此多线程并不能很好的解决客户端高并发发送请求的问题。

这听起来很扯淡,我们使用的服务器配置动不动就8核16G,为什么发送http请求的能力如此弱鸡,实际上这并不是服务器的锅,也不是java的锅,而是http工作模式的原因,在发送数据和得到数据的过程中有一个等待的过程,等待的过程并不消耗CPU,但是会让当前线程陷入等待,干不了别的事情。如果把多线程转换成线程池的模式,那么使用同步http时,在高并发场景下,线程池的队列中会堆积大量请求任务发不出去,而被请求的目标服务器,却还远没有达到瓶颈。

解决方案是使用异步http模型,我们知道nodejs因为天生的异步高性能而出名,实际上异步并不是nodejs的专利,任何主流的高级语言都支持,如 java、c++、.net等。

异步为什么快呢?因为异步http去除了同步http请求的等待过程,只保留了发送和处理得到数据的过程, 这听起来很扯蛋,发送http怎么可能没有等待呢?我在浏览器里访问网站不也要等一会才能打开页面吗? 实际上异步http请求并不是没有等待,只是把等待的这个步骤从当前线程转移到了别的地方,当前线程除了发送数据, 可以不干别的事情,而发送数据非常快,每一刻都是成千上万,可以充分利用计算机资源,而不是空等啥都干不了。

而http结果的响应,可以理解成以事件响应的形式触发,或者更通用的说法是回调函数的形式,所以发送数据和处理结果是两个不同的分支,也可以理解成处于不同的线程,互不干扰。

要较为深刻的理解异步http,还需要从TCP说起。TCP连接就像一根双向流通的管道,客户端从一端发送数据给服务器,服务器也从另一端发送数据给客户端。http本质上也是这种工作模式。客户端把一些http规范指定的必须数据项,包括请求头、请求主体、内容长度等信息打包成一个http请求数据包,通过TCP连接发送给服务器。服务器接受到http请求数据包,解码处理后,组装一个http响应包,发送给客户端。所以http本质上还是基于TCP的。

异步http就是这种底层工作模式的体现,客户端向服务器发送http请求,然后去做别的事情了,比如发另一个请求给服务器。至于服务器何时把响应数据包发送过来,客户端可以不管,至少在当前执行的上下文中可以不管,因为当服务器响应时,会有另外的线程被唤醒处理这个响应。

既然异步http更接近http的本质,性能也更高,那么为什么还会有同步http出现呢?而且通常还是使用http请求的默认模式。主要原因还是同步 http使用简单,易于理解,更符合人类正常思考问题的思维,也更容易让新手入门。

同步http只是将异步http进行了封装,当客户端发送一个http请求时,让当前线程进入等待,当结果响应了再让当前线程唤醒处理结果。这样整个http的过程变的简单了,但是却远离了tcp的本质,性能也更差劲了。

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

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

相关文章

台式电脑无法进桌面问题

楼主家里的台式电脑有一段时间进不了桌面,一度很困扰。 最开始发现有一个存储盘没有显示,拆开主机盖,把显卡、内存、硬盘都重新往紧压了下。重新开机后,显示器还是黑的。 表现为主机启动的声音正常,显示器没有信号接…

网络编程、UDP、TCP

计算机网络 就是将地理位置不同的具有独立功能的多台计算及外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件以及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 目的 传播交流信息、数据交换、通信 如何做…

【k8s资源调度-Deployment】

1、标签和选择器 1.1 标签Label 配置文件&#xff1a;在各类资源的sepc.metadata.label 中进行配置通过kubectl 命令行创建修改标签&#xff0c;语法如下 创建临时label&#xff1a;kubectl label po <资源名称> apphello -n <命令空间&#xff08;可不加&#xff0…

【Ubuntu】通过网线连接两台电脑以实现局域网连接的方法

有时我们需要将多台计算机连接在一起&#xff0c;以便实现数据共享、资源访问等功能。本文将介绍如何通过网线连接两台运行Ubuntu操作系统的电脑&#xff0c;以便它们能够直接通信&#xff0c;从而实现局域网连接。 1. 准备工作 在开始之前&#xff0c;请准备好&#xff1a; …

Java毕业设计-基于ssm的共享型汽车租赁管理系统-第64期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的共享型汽车租赁管理系统&#xff1a;有配套报告文档&#xff0c;前端jsp、jquery、bootstrap&#xff0c;后端 springmvc、spring、mybatis&#xff0c;集成汽车…

【JVM】StringTable 字符串常量池

目录 一、字符串常量池 二、String的不可变性 三、String的内存分配 四、intern() 方法与 new String() 一、字符串常量池 JVM的字符串常量池&#xff08;String Constant Pool&#xff09;是一块位于方法区&#xff08;Method Area&#xff09;的内存区域&#xff0c;用于…

四、深入学习TensorRT,Developer Guide篇(三)

上一篇文章我们一起看了下TensorRT有哪些特性或者支持哪些功能&#xff0c;这一节我们来详细的从API出发研究一下具体的实现&#xff0c;难度要上升了哦&#xff0c;请系好安全带&#xff0c;准备发车&#xff01; 文章目录 3. The C API3.1 The Build Phase3.1.1 Creating a …

10-pytorch-完整模型训练

b站小土堆pytorch教程学习笔记 一、从零开始构建自己的神经网络 1.模型构建 #准备数据集 import torch import torchvision from torch.utils.tensorboard import SummaryWriterfrom model import * from torch.utils.data import DataLoadertrain_datatorchvision.datasets.…

【深度学习】Pytorch 教程(十一):PyTorch数据结构:4、张量操作(2):索引和切片操作

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…

企业如何定制化“可靠的”系统,实现数字化转型?

二十大提出高质量发展是首要任务&#xff0c;为顺应数字经济时代的发展&#xff0c;数字化转型正不断赋能各行各业。越来越多的企业管理者也意识到数字化转型是帮助企业提升内部运营效率&#xff0c;提升业务开展效率&#xff0c;减低企业成本的有效手段。 那么如何推动企业数字…

linux前端部署

安装jdk 配置环境变量 刷新配置文件 source profile source /etc/profile tomcat 解压文件 进去文件启动tomcat 开放tomcat的端口号 访问 curl localhsot:8080 改配置文件 改IP,改数据库名字&#xff0c;密码&#xff0c; 安装数据库 将war包拖进去 访问http:…

wpf 3d 后台加载模型和调整参数

下载了一个代码&#xff0c;加载obj模型&#xff1b;它的参数在xaml里&#xff0c;模型加载出来刚好&#xff1b; 然后加载另一个obj模型&#xff1b;加载出来之后大&#xff0c;偏到很高和左的位置&#xff1b; 它之前的摄像机位置&#xff0c; Position"9.94759830064…

橘子学es原理01之准备工作

es本身是具备很好的使用特性的&#xff0c;我指的是他的部署方面的&#xff0c;至于后期的使用和运维那还是很一眼难尽的。 我们从这一篇开始就着重于es的一些原理性的的一些探讨&#xff0c;当然我们也会有一些操作性的&#xff0c;业务性的会分为多个栏目来写。比如前面我写的…

AutoSAR(基础入门篇)10.8-实验:模式管理

目录 一、配置BswM 二、配置唤醒源 三、配置ComM Users 四、配置BswM的通信控制 五、Service Mapping 首先备份上一次的工程&#xff0c;养成好习惯&#xff08;最好还是用Git&#xff0c;这次最后再安利一下Git这个神器&#xff09;。今天的实验异常的简单&#xff0c;基…

SpringMVC 学习(三)之 @RequestMapping 注解

目录 1 RequestMapping 注解介绍 2 RequestMapping 注解的位置 3 RequestMapping 注解的 value 属性 4 RequestMapping 注解的 method 属性 5 RequestMapping 注解的 params 属性&#xff08;了解&#xff09; 6 RequestMapping 注解的 headers 属性&#xff08;了解&…

CSS三大定位方式(浮动、定位、弹性盒)详细解析

CSS三大定位方式 前言&#xff1a;作为一名前端开发&#xff0c;已经工作2年了。由于自己是半路出家&#xff0c;从嵌入式方向转到前端开发&#xff0c;都是边百度边开发&#xff0c;很多基础都不了解&#xff0c;只要解决问题就好&#xff0c;但是近来为了让自己知识体系化&a…

【数据结构(顺序表)】

一、什么是数据结构? 数据结构是由“数据”和“结构”两词组合而来。 什么是数据&#xff1f;常见的数值1、2、3、4.....、教务系统里保存的用户信息&#xff08;姓名、性别、年龄、学历等等&#xff09;、网页里肉眼可以看到的信息&#xff08;文字、图片、视频等等&#xff…

Yolo v9 “Silence”模块结构及作用!

论文链接&#xff1a;&#x1f47f; YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 代码链接&#xff1a;&#x1f47f; https://github.com/WongKinYiu/yolov9/tree/main Silence代码 class Silence(nn.Module):def __init__(self):supe…

Mysql运维篇(四) MHA

大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#xff09; - 知乎 一、MHA简介&#xff1a; MHA&#xff08;Master High Availability&#xff09;目前在MySQL高可用方面是一个相对成熟的解决方案&#xff0c;它由日本DeNA公司y…

【Linux进程】进程状态---进程僵尸与孤儿

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.进程排队2.进程状态…