如何在 NodeJS 中实现并发或上下文切换

How to implement concurrency or context-switching in NodeJS

所以我有一个名为 www.example.com/endpoint 的 API 端点,上面有很多设备 post(我在物联网公司工作)。我们已经在 NodeJS 中实现了整个支持,并且在从 1 台设备扩展到 'n' 台设备时遇到了困难。设备 post 它们在这个 API 端点的数据包,我从那里执行一段复杂的代码(和 1000 行)并将设备的状态保存在数据库中(mongoDB)。现在的问题是。每当我从设备 1 收到一个数据包并执行它,在中间我从设备 2 收到一个数据包时,NodeJS 保持设备 1 执行原样并开始从设备 2 提供数据包 2,我在放置时看到了这个广泛的 console.log() 语句
现在在一个理想的世界。我希望 Node 将我当前进度的上下文保存在数据包 1 中。然后离开。然后继续将数据包 2 保存在队列中以供稍后处理。处理完数据包 1 后,我将处理数据包 2 并对其进行处理。
我知道像 RabbitMQ 和 kue 这样的库可以将它存储在队列中并稍后处理它,但是我如何从一个执行上下文切换到另一个执行?
这是我的想法。也可能有其他解决方案。想听听您对此事的看法。

Q: 如何在NodeJS中实现并发或上下文切换

A: 简短回答:不可能。因为Javascript是单线程的。


问: 现在问题来了。每当我从设备 1 收到一个数据包并执行它,在中间我从设备 2 收到一个数据包时,NodeJS 保持设备 1 执行原样并开始从设备 2 提供数据包 2,我在放置时看到了这个广泛的 console.log() 语句

A: 正如您可能已经在许多地方读到的那样,NodeJS 基于一个事件驱动模型,该模型对于 I/O.

Node 似乎中途放弃 device1 服务 device2 的原因是因为 device1 的代码已经处理到它正在等待的地步一个 asynchronous function 回调。例如。执行数据库写入。所以与此同时,当它可用时,它继续服务 device2

device2 的类似情况 - 一旦它命中 async 函数,事件被推入事件队列,等待 return。如果有回复,Node 可能会返回到 device1。或者它可能是其他设备,deviceN.

我们说 NodeJS 是非阻塞的,因为 node 进程不会为了单一响应而锁定整个 Web 应用程序。相反,它继续前进并从队列中选择下一个事件(本质上是一个代码块)到 运行 它。因此它一直很忙,除非事件队列中真的没有可用的东西。


问: 我知道像 RabbitMQ 和 kue 这样的库可以将它存储在队列中并稍后处理它,但是我如何从一个执行上下文切换到另一个执行?

答: 如前所述。截至 2016 年 - Javascript 仍然无法进行线程化。 NodeJS 不是 专为繁重的计算工作而设计,它应该只专注于服务请求,因此代码最好是轻量级和非阻塞的。基本上,您将希望通过使用异步函数包装调用来离开那些繁重的 I/O 职责,例如写入文件或数据库或向其他进程发出 HTTP 请求(网络)。

NodeJS 不是银弹技术。如果您的应用程序需要在事件线程上执行大量计算工作,那么 Node 可能不是一个好的技术选择,但这不是世界末日 - 因为您可以为繁重的计算工作。

参见: https://nodejs.org/api/child_process.html

您可能还想考虑替代方案,例如 Java,它具有 NIOThreading 功能。