nodejs如何处理更多的并发请求?

时间:2016-05-04 06:12:17

标签: php node.js multithreading asynchronous concurrency

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

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

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

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

  • 有人能解释我怎么样?

我一直试图了解nodejs得分及其主要优势,但我只是没有得到它的本质。

2 个答案:

答案 0 :(得分:1)

Apache完全基于线程,如您所描述的.WHile nodejs是基于事件的。它使用事件循环。 现在让我们举个例子。 假设你有成千上万的请求。在apache中它会为每个请求产生线程(这显然有一个瓶颈,你不能垂直扩展以支持这个。) 在节点js 1中,实例将具有单个线程。它不会阻塞i / o。同时i / o在那里它可以接受并开始处理(cpu相关)新请求。 nodejs中的并发性更高。因为它允许同时处理许多请求。但是我没有对nodejs中的请求处理是否稍微高一点进行任何基准测试。但是就并发性而言,nodejs会打败任何一个竞争对手。

答案 1 :(得分:1)

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

enter image description here

并且有以下步骤:

  1. 客户端向NodeJS服务器发送HTTP请求。
  2. 请求来到Event Loop(单线程),由操作系统唤醒。它将每个请求/响应作为Javascript闭包传递给具有回调的相关工作者函数。
  3. 之后,您在非阻塞工作人员中执行一些操作(长时间运行的工作等)。
  4. 一旦完成,响应将通过回调发送回主线程。
  5. 最后Event Loop将结果返回给客户。
  6. 这样NodeJS主线程本身就不会执行任何操作,只会将管理过程委托给非阻塞工作者,在那里你可以同时执行你的魔法工作。

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

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

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

    非阻止操作会立即发生,因此一切都取决于vertical scaling。这意味着它将以当前硬件配置可能的速度接收/响应。

    提高服务器性能:

    • 横向,您可能希望使用NodeJS clusters,负载平衡器配置等。
    • 垂直,您可能想要使用V8引擎。查看here以查找更多V8标志。或者你可以升级你的硬件。

    例如,max_old_space_size

    –max-old-space-size=8192
    
      

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