所以我有一个名为www.example.com/endpoint的API端点,其上发布了很多设备(我在IOT公司工作)。我们已经在NodeJS中实现了我们的全部支持,并且在从1个设备扩展到' n'设备数量。设备在此API端点发布其数据包,从中执行复杂的代码(arnd 1000行)并将设备状态保存在数据库(mongoDB)中。现在的问题是。每当我收到来自设备1的数据包并且我正在执行它时,我从中间获得设备2的数据包,NodeJS使设备1按原样执行并开始从设备2提供数据包2,当我放置时,我看到了这一点广泛的console.log()语句
现在处于一个理想的世界。我希望Node用数据包1保存当前进度的上下文然后离开。并继续将数据包2保存在队列中以便稍后处理。一旦我完成了数据包1,我将接收数据包2并处理它
我知道像RabbitMQ和kue这样的库将它存储在队列中并稍后处理它,但是我如何从一个执行转换到另一个执行?
这是我的思维方式。也可能有其他解决方案。想听听你对此事的看法。
答案 0 :(得分:2)
问: 如何在NodeJS中实现并发或上下文切换。
答:简答:不可能。因为Javascript是单线程的。
问: 现在的问题是。每当我收到来自设备1的数据包并且我正在执行它时,我从中间获得设备2的数据包,NodeJS使设备1按原样执行并开始从设备2提供数据包2,当我放置时,我看到了这一点广泛的console.log()语句
答:正如您可能已经在许多地方看到NodeJS
基于事件驱动的模型,该模型对I / O没有阻塞。
Node似乎放弃device1
中途服务device2
的原因是因为device1
的代码已经处理完毕,直到等待asynchronous function
{1}}回调。例如。执行数据库写入。因此,当它可用时,它继续服务device2
device2
的类似情况 - 一旦它遇到async
函数,其中事件被推入事件队列,等待返回。如果回复,Node
可能会返回device1
。或者它可能是其他设备,deviceN
。
我们说NodeJS是非阻塞的,因为node
进程没有锁定整个Web应用程序以获得唯一的响应。相反,它继续从队列中选择下一个事件(实质上是一段代码)来运行它。因此它会一直很忙,除非事件队列中没有任何可用的东西。
问:我知道像RabbitMQ和kue这样的库将它存储在队列中并稍后处理它,但是我如何从一个执行转换到另一个执行?
答强> 如前所述。截至2016年 - Javascript仍无法进行线程化。 NodeJS 不设计用于繁重的计算工作,它应该只关注服务请求,因此代码最好是轻量级和非阻塞的。基本上,您将希望保留那些繁重的I / O职责,例如写入文件或数据库,或者通过使用异步函数包装调用,将HTTP请求(网络)发送到其他进程。
NodeJS不是一种银弹技术。如果您的应用程序需要在事件线程上进行大量的计算工作,那么Node
可能不是一个很好的技术选择,但它不是世界末日 - 因为您可以为自己的子进程分叉繁重的计算工作。
查看:强> https://nodejs.org/api/child_process.html
您可能还想考虑具有Java
和NIO
功能的Threading
替代方案。