有没有使用RabbitMQ和Node.js长期运行的过程?

我想了解在Node.js中处理长时间运行任务的最佳方法。 显然,在Node.js中执行长时间运行的过程并不是一个好主意,因为节点的单线程性质。

我是RabbitMQ的忠实粉丝,所以我正考虑在两个节点之间放置两个带有兔子的节点服务器:

Node.js Web Server <--> RabbitMQ <--> Node.js Backend Worker 

当然这个想法是不要放慢Web服务器的速度。 我通常会用Javareplace后端服务器,但我试图保留所有的JS。

我不是一个节点程序员,所以我不确定这是一个好主意,甚至可能吗? 有没有人尝试过这样的事情?

这取决于你的意思是“长时间运行的过程” – 要阻止Node.JS,你必须一次做很多的计算。 做I / O(粗略地说,调用一些需要callback参数的东西)会产生事件循环。

在一个不主要涉及I / O的网站中,可以说有很less的事情可以做。 例如,与数据库交谈 – I / O。 从文件系统读取模板 – I / O。 (用数据库中的数据运行一个模板 – 好吧,不是I / O,可能也不是很贵。

如果您的图中只有两个Node.JS进程,那么对每个客户端的响应仍然会持续很长时间(I / O时间加上计算时间)。 但是,您可能会获得更好的吞吐量,因为您不会序列化传入的请求。 另一方面,这些请求可能只是在RabbitMQ中进行备份,将更高的吞吐量转化为更高的延迟。

您也有机会运行/更多/不止一个后端工作者,以更快地完成请求。 在Web服务器上完成这项工作,但是运行一大堆web服务器进程并在那些使用nginx进行负载平衡的方面也会产生类似的效果。