繁体   English   中英

Node.js如何处理更多并发请求?

[英]How is nodejs able to handle more concurrent requests?

我一直在阅读apachenodejs之间的以下参数,我不明白。

Apache是基于线程和进程的, ie每个请求都由单独的线程或进程处理(取决于配置),这意味着如果进程正在等待I / O,则整个线程都将被阻塞。

  • 我在这里放了什么? 运行nodejs时,我也将等待,即使这意味着异步等待。 是不是

每个nodejs实例都在单个线程中运行,并且由于其异步特性,与apache相比,它可以处理更多的并发请求

  • 谁能解释我怎么做?

我一直在尝试了解nodejs的得分及其主要优点,但我只是不了解它的本质。

如前所述,Apache完全基于线程,而nodejs基于事件,它使用事件循环。 现在举一个例子。 假设您有成千上万个请求。在Apache中,它将为每个请求生成线程(这显然是一个瓶颈,您不能在垂直方向上进行过多扩展以支持它。)而在节点js中,1个实例将只有一个线程。平均来说,当有I / O时,它可以接受并开始对新请求进行处理(与CPU相关)。 nodejs的并发性更高,因为它允许同时处理许多请求。但是我没有关于nodejs中请求处理是否更高的基准,但是在并发性方面,nodejs会击败它的任何一个竞争对手。

为了更好地理解,让我们从这张图片开始:

在此处输入图片说明

并执行以下步骤:

  1. 客户端将HTTP请求发送到NodeJS服务器。
  2. 请求进入Event Loop (单线程),该Event Loop由操作系统唤醒。 它将每个请求/响应作为JavaScript闭包传递给具有回调的相关辅助函数。
  3. 之后,您可以在不阻塞的工作程序中执行一些操作(长时间运行的工作等)。
  4. 完成后,响应将通过回调发送回主线程。
  5. 最后, Event Loop将结果返回给客户端。

这样,NodeJS主线程本身不会执行任何操作,只会将管理过程委派给非阻塞性工作人员,您可以在其中并行执行魔术工作。

注意: NodeJS一次只能接收或响应一个请求。 但是,它可以同时处理多个请求。


例如,您一次有100000个请求。 在请求处理程序中执行blockingnon-blocking操作确实很有意义。

阻止操作将阻止javascript处理,因为它是同步操作。 此行为可能导致服务器停止。

非阻塞操作将立即发生,因此一切都将取决于垂直缩放 这意味着它将以当前硬件配置的最快速度接收/响应。

要提高服务器性能:

  • 从水平上讲 ,您可能想使用NodeJS 集群 ,负载均衡器配置等。
  • 纵向而言 ,您可能想使用V8引擎。 在此处查找更多V8标志。 或者,您当然可以升级硬件。

例如, max_old_space_size

–max-old-space-size=8192

增加了每个V8节点进程的限制,以使用最大8Gb的堆内存,而不是64位计算机上的默认1,4Gb(32位计算机上的512Mb)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM