【问题标题】:Ever use RabbitMQ and Node.js for long running process?曾经使用 RabbitMQ 和 Node.js 进行长时间运行的进程吗?
【发布时间】:2011-09-05 14:16:14
【问题描述】:

我试图了解在 Node.js 中处理长时间运行的任务的最佳方式。显然在 Node.js 中做一个长时间运行的进程并不是一个好主意,因为 node 的单线程特性。

我是 RabbitMQ 的忠实粉丝,所以我想有两个节点服务器,中间有 rabbit:

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

我们的想法当然是永远不要减慢 Web 服务器的速度。我通常会用 Java 替换后端服务器,但我试图将其全部保留为 JS。

我不是 Node 程序员,所以我不确定这是一个好主意还是可能?有人试过这样的吗?

【问题讨论】:

  • 我最终只制作了后端工作者 Java,但仍然有前面的节点和中间的兔子。

标签: node.js rabbitmq


【解决方案1】:

这取决于您所说的“长时间运行的进程”是什么意思——要阻止 Node.JS,您必须同时进行大量计算。执行 I/O(粗略地说,调用带有回调参数的东西)将屈服于事件循环。

可以说,在网站中几乎不涉及 I/O 的事情很少。例如,与数据库对话——I/O。从文件系统读取模板——I/O。 (使用来自数据库的数据运行模板——好吧,不是 I/O。可能也不是很贵。)

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

然后,您还有机会运行 /more/ 多个后端工作程序,以更快地处理请求。只在 Web 服务器中完成这项工作,但运行一堆 Web 服务器进程并在那些使用 nginx 的进程之间进行负载平衡,会产生类似的效果。

【讨论】:

  • 当我的意思是长时间运行时,我的意思是批量导入或处理至少需要几分钟到几个小时。这些进程不一定是由普通用户请求启动的。我认为 Java 是一个更好的选择,原因是:我非常了解 :)、Hadoop,虽然 Java 很烂,但 JVM 很擅长这些东西。我喜欢 RabbitMQ,因为我可以在以后感觉更舒服时将其切换回 NodeJS。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2019-01-11
  • 2010-10-11
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多