【问题标题】:Express.js with Node.js, multiple clientsExpress.js 与 Node.js,多个客户端
【发布时间】:2018-09-15 12:02:26
【问题描述】:

我在 Google 上没有找到好的答案,所以我在这里尝试。

我的应用程序包括:Express.js、node.js 和 MySQL 数据库。但是,此应用程序需要为多个客户端提供服务。

在我的代码中,我需要使用回调,以便程序在继续之前等待数据库查询完成。这会影响其他想要同时访问数据库的用户吗?

【问题讨论】:

    标签: javascript mysql node.js express


    【解决方案1】:

    要明确回答这个问题,我认为需要对 Node.js 异步事件循环有更深入的了解。

    JavaScript 是单线程的,使用这个异步事件循环允许 Node.js 在这个单线程上执行非阻塞 I/O 操作。

    它实现这一点的方法是在需要时(例如当有大量请求或 I/O 操作时)将操作卸载到内核,然后在事件的稍后时间将结果重新拾取循环,在“轮询”阶段。

    为了进一步说明,我在 Node.js 文档中包含了图表:

       ┌───────────────────────────┐
    ┌─>│           timers          │
    │  └─────────────┬─────────────┘
    │  ┌─────────────┴─────────────┐
    │  │     pending callbacks     │
    │  └─────────────┬─────────────┘
    │  ┌─────────────┴─────────────┐
    │  │       idle, prepare       │
    │  └─────────────┬─────────────┘      ┌───────────────┐
    │  ┌─────────────┴─────────────┐      │   incoming:   │
    │  │           poll            │<─────┤  connections, │
    │  └─────────────┬─────────────┘      │   data, etc.  │
    │  ┌─────────────┴─────────────┐      └───────────────┘
    │  │           check           │
    │  └─────────────┬─────────────┘
    │  ┌─────────────┴─────────────┐
    └──┤      close callbacks      │
       └───────────────────────────┘
    

    可以在以下位置详细了解这些阶段:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

    简而言之:

    • timers:计划的回调和任何设置在定时器上的东西都会在这里执行,例如 setInterval() 或 setTimeout()。这是第一个的原因是,这些只是保证指定的时间量是它们可以触发的最短时间。该时间也被事件循环周期完成的时间填充。将它们放在这里可以使它们最准确地与开发人员在间隔或超时函数中指定的内容保持一致。
    • 待处理回调:执行推迟到下一个循环迭代的 I/O 回调。如果在任何事件循环中达到最大回调数,则需要执行的其余回调将推迟到下一个循环(可以通过 process.nextTick() 手动实现),所以 - 在计时器之后,这些应该执行下一个
    • idle:只在内部使用。如果事件循环中没有任何内容需要处理,则循环将停止将任何内容延迟到内核,直到需要为止
    • prepare:只在内部使用。如果需要一个或多个,则为下一个事件循环周期做准备
    • poll:检索新的 I/O 事件;执行 I/O 相关的回调(几乎所有 关闭回调、计时器安排的回调和 setImmediate()) 除外;节点 适当的时候会在这里屏蔽。这个轮询阶段允许任何被推迟的事情继续进行。
    • 检查:这里调用了 setImmediate() 回调
    • 关闭回调:一些关闭回调,例如socket.on('close', ...) 和其他 'close' 事件在这里调用

    同样,大部分内容来自 Node.js 文档,但我已经详细阐述了一些细节,以便在此上下文中提供一些理解。

    在您的情况下,您的数据库操作不会“阻止”其他用户,他们只需要等到通过循环处理他们的回调。如果同时有许多操作,更多操作将被卸载到内核,然后尽快恢复,这可能会提供一些轻微的额外延迟(1)

    另一个有助于可视化此过程的好图形来自这篇文章:https://webapplog.com/you-dont-know-node/

    附注——

    在某些地方,Node.js 的事件循环是一个很好的解决方案,而在其他地方,更强大的多线程解决方案可能是更好的方法。确保您进行必要的研究,以便明智地做出与项目细节相关的决定,这绝不是一个坏主意。

    (1) 有几篇文章只是谷歌搜索,关于性能差异、网络负载过重的预期延迟以及解决此问题的各种解决方案。

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多