Express.js与Node.js,多个客户端

时间:2018-09-15 12:02:26

标签: javascript mysql node.js express

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

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

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

1 个答案:

答案 0 :(得分:4)

要明确回答这个问题,我认为需要对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/

简而言之:

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

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

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

本文还提供了另一个有助于形象化这一过程的良好图形:https://webapplog.com/you-dont-know-node/

Node Async Event Loop Graphic

旁注-

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

(1)那里有几篇文章,它们只是Google搜索的内容,包括性能差异,预期的网络负载延迟以及各种解决方案。

我希望这会有所帮助!