我正在尝试理解在Node.js中处理长时间运行任务的最佳方法.显然在Node.js中执行一个长时间运行的过程并不是一个好主意,因为节点的单线程特性.
我是RabbitMQ的忠实粉丝所以我想在两个节点服务器之间使用兔子:
Node.js Web Server <--> RabbitMQ <--> Node.js Backend Worker
Run Code Online (Sandbox Code Playgroud)
当然,我们的想法是不要放慢Web服务器的速度.我通常会用Java替换后端服务器,但我试图将它全部保留为JS.
我不是Node程序员所以我不确定这是一个好主意还是可能?有没有人尝试过这样的东西?
小智 0
这取决于“长时间运行的进程”的含义——要阻止 Node.JS,您必须同时进行大量计算。执行 I/O(粗略地说,调用带有回调参数的东西)将产生事件循环。
可以说,在网站中几乎没有什么事情不涉及 I/O。例如,与数据库对话——I/O。从文件系统读取模板——I/O。(使用数据库中的数据运行模板——好吧,不是 I/O。可能也不是很昂贵。)
如果如图所示只有两个 Node.JS 进程,那么对每个客户端的响应仍然需要很长时间(I/O 时间加上计算时间)。但是,您可能会获得更好的吞吐量,因为您不会序列化传入请求。另一方面,请求可能会在 RabbitMQ 中备份,从而将更高的吞吐量转化为更高的延迟。
然后,您还有机会运行/多个/多个后端工作程序,以更快地处理请求。仅在 Web 服务器中完成工作,但运行一堆 Web 服务器进程并在这些进程之间进行负载平衡(例如 nginx),也会产生类似的效果。