两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

2024-05-03

昨天我做了一些关于 NodeJS 的演讲。 有人问我以下问题:

我们知道nodeJS是一个单线程服务器,多个请求是 到达服务器并将所有请求推送到事件循环。如果什么 两个请求同时到达服务器,服务器将如何处理 处理这种情况?

我猜到了一个想法并回复如下:

I guess 没有两个 http 请求可以完全相同地到达服务器 时间,所有请求都通过单个套接字,因此它们将排在队列中。 HTTP 请求具有以下格式:

请求的时间戳包含在其标头中,并且可以根据标头中的时间戳将它们推送到事件循环。

但我不确定我给了他正确还是错误的答案。


我想没有两个http请求可以同时到达服务器, 所有请求都通过管道,因此它们将排在队列中。

这部分基本上是正确的。传入连接进入事件队列,其中一个必须首先放入队列中。

如果两个请求同时到达两个服务器怎么办? 服务器会处理这种情况吗?

由于服务器正在单个进程中的单个套接字上侦听传入 TCP 连接,因此不可能同时有两个传入连接。底层操作系统将稍微先于另一个处理其中一个。这样想吧。传入连接是网络连接上的一组数据包。其中一个传入连接的数据包将先于另一个传入连接。

即使您有多个网卡和多个网络链接,因此两个传入连接实际上可以在同一时刻到达服务器,node.js 队列也将通过互斥锁之类的东西来保护并发性,并且其中一个传入连接将抢占互斥体在另一个之前,并在另一个之前被放入事件队列中。

第一个被操作系统处理的事件将在另一个事件之前被放入 Node.js 事件队列中。当 node.js 可用于处理事件队列中的下一个项目时,事件队列中第一个传入的请求将首先开始处理。

因为node.js JS执行是单线程的,所以处理该请求的代码将运行其同步代码来完成。如果它有异步操作,那么它将启动该异步操作并返回。然后,这将允许处理事件队列中的下一个项目,并且第二个请求的代码将开始运行。它将同步运行直至完成。与第一个请求一样,如果它有异步操作,那么它将启动该异步操作并返回。

此时,在两个请求开始异步操作然后返回之后,就只剩下事件队列了。当其中一个异步操作完成时,它将向事件队列发送另一个事件,当 Node.js 的单线程空闲时,它将再次处理事件队列中的下一项。如果两个请求都有大量异步操作,则它们的进度可能会交错,并且在触发异步操作时都可能同时“进行中”,然后返回,直到异步操作完成,当 Node.js 启动时,它们的处理会再次开始。可以自由地处理下一个事件。

请求的时间戳包含在其标头中,它们可能是 根据标头中的时间戳推送到事件循环。

这部分不太正确。相同类型的传入事件在到达时会添加到队列中。第一个到达的首先进入队列 - 没有任何步骤检查某些时间戳。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢? 的相关文章

随机推荐

  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • 混淆 bash 中存储的密码

    我有一个 bash 脚本 我需要编写密码才能运行程序 其他人可以看到它 有没有办法把密码写得不太明显 即使他可以在 bash 中执行相同的命令并获取密码 他也无法读取文本形式的密码 今天我这样做 PASSWORD 1234567 progr
  • TypeScript 中类似字典的对象应使用什么类型?

    在 TypeScript 中 我有时会使用期望 或返回 对象的函数 其中这些对象被视为字典 基本上我的问题是 这里使用的正确类型是什么 我可以用 Record
  • 使用 asyncore 读取网站

    我想异步阅读一个网站 据我所知 这是不可能的 urllib 现在我尝试使用普通套接字进行阅读 但是 HTTP 给我带来了麻烦 我遇到了各种时髦的编码 例如传输编码 分块 必须手动解析所有这些东西 我现在想编码 C 而不是 python 难道
  • C++ 析构函数和函数调用顺序

    假设我有以下代码片段 Foo foo return bar 现在 C 标准是否保证 bar 将在 foo Foo 之前调用 或者这是编译器 实现的选择 Thanks 这是有保证的行为 实际执行过程如下 0 enter block scope
  • C++ 令人头疼的命名空间

    好吧 这个问题已经发生了一些变化 我想尝试从我正在追求的基本目标开始 重新 创建在 C 资源获取和初始化中包装遗留 C 语言实体的库代码 并提供基本或更好的异常保证 使此代码的客户端能够以非常自然的 C 方式使用它 而不会为现有代码创建大量
  • JS 是否支持使用键函数而不是比较器进行排序?

    JavaScript 的array sort https developer mozilla org en US docs Web JavaScript Reference Global Objects Array sort Syntax方
  • 在 R 闪亮应用程序中评级星星

    我正在尝试向我闪亮的应用程序添加一些元素 以使其看起来更好 因此 我正在使用新的shiny semantic包允许以简单的方式添加语义 UI 元素 人们可以在这里找到闪亮的语义元素的示例 http demo appsilondatascie
  • 从服务(IntentService)和活动执行的AsyncTask - 有区别吗?

    从 Activity 或 IntentService 启动 AsyncSync 之间有什么区别吗 我正在构建一个通过 http 下载和上传文件的应用程序 我为每次传输使用带有进度条的自定义通知布局 我选择并行传输或将它们放入队列 您会推荐哪
  • AWS CloudFront 重定向到 S3 存储桶

    我创建了一个 CloudFront 发行版来为静态网站提供服务 S3是源服务器 现在 如果我们访问 CloudFront URL 它会重定向到 S3 位置 d2s18t7gwlicql cloudfront net or test tele
  • 计算 QR 码对齐图案的位置

    我需要知道如何计算 QR 码对齐图案的位置 如中定义ISO IEC 18004 2000 附录 E 表 http www arscreatio com repositorio images n 23 SC031 N 1915 18004Te
  • Chrome DevTools 脚本黑盒不起作用

    我正在尝试使用 chrome devtools 的新功能 黑盒脚本 这篇 Chrome Devtools 文章列出了脚本黑盒功能 https developer chrome com devtools docs blackboxing wh
  • C++ win32设置光标位置

    我知道要使用哪个功能 但我无法让它正常工作 我用了SetCursorPos 唯一的问题是它将光标设置为屏幕坐标而不是窗口坐标 我也尝试过ScreenToClient 但它并没有起作用 这是我的代码 pt x 113 pt y 280 Scr
  • 本地通知替代周重复

    我有两个通知 我想隔周重复一次 例如 在第一周的星期一设置一个通知 并应在第三周的星期一重复 第二次通知设置在第二周的星期二 并且应在第四周的星期二重复 为此我该怎么办 获取周数 并根据周数做出决定
  • 包含一个树枝文件并从单独的文件传递变量?

    我有container twig 包括component twig并传递一个名为 mock 的对象 在container twig中 set mock title This is my title include component twi
  • 解释一下 $CI =& get_instance();

    查看codeigniter的源代码 在它的辅助函数中我不断看到代码 CI get instance 谁能向我解释一下这段代码是如何工作的 我知道它正在返回对 CI 超级对象的引用 但是在哪里get instance 来自 这基本上是一个单例
  • 如何在 wpf 密码框设置一些默认文本? [复制]

    这个问题在这里已经有答案了 可能的重复 WPF 中的水印文本框 https stackoverflow com questions 833943 watermark textbox in wpf 我可以知道如何在 WPF 的密码框中放入一些
  • 为什么更新功能在Unity中的UnityARWorldMap场景的UnityARHitTestExample中不起作用?

    我正在开发 UnityARWorldMap 以创建统一的持久性 因此 我将模型放置在现实世界中 保存它们 然后加载它们 当我单击 WorldMapManager cs 中的 Load 时 UnityARhitTestExample 中的更新
  • python: X 服务器上的致命 IO 错误 11(资源暂时不可用):0.0

    我正在尝试读取一些图像 稍后打算对它们执行一些任务 同时将图像读入内存 我想显示动画 gif 图像 为此 我必须使用线程 现在它给出错误 python Fatal IO error 11 Resource temporarily unava
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如