首页 文章

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

提问于
浏览
0

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

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

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

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

  • 有谁能解释我怎么样?

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

2 回答

  • 1

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

    enter image description here

    并且有以下步骤:

    • 客户端向 NodeJS 服务器发送HTTP请求 .

    • 请求来到 Event Loop (单线程),由操作系统唤醒 . 它将每个请求/响应作为Javascript闭包传递给具有回调的相关工作器函数 .

    • 之后,您在非阻塞工作者中执行一些操作(长时间运行的作业等) .

    • 一旦完成,响应将通过回调发送回主线程 .

    • 最后 Event Loop 将结果返回给客户端 .

    这样NodeJS主线程本身不会执行任何操作,只会将管理过程委托给非阻塞工作者,您可以同时执行神奇的工作 .

    Note: NodeJS一次只能接收或响应一个请求 . 但是,在同一时间它可以处理多个请求 .


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

    Blocking 操作将阻止javascript处理,因为它停止了's synchronous action takes place. This behavior can lead to server' .

    Non-blocking 操作将立即发生,因此一切都将取决于vertical scaling . 这意味着它将尽可能快地接收/响应当前的硬件配置 .

    要提高服务器性能:

    • Horizontally ,你可能想玩NodeJS clusters,负载均衡器配置等 .

    • Vertically ,你可能想玩V8引擎 . 看here找到更多的V8标志 . 或者您可以升级您的硬件 .

    例如,max_old_space_size

    –max-old-space-size=8192
    

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

  • 1

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

相关问题