在Express Routes中为长时间运行的任务卸载策略

时间:2015-02-19 13:05:43

标签: node.js express rabbitmq long-running-processes

我有一个应用程序,它使用Express作为我的REST API的面向用户的框架,以及RabbitMQ,用于对集群后端的类似RPC的函数调用。另外,我使用Q来宣传路由中的所有工作量。

在我使用的其中一个路由中,我触发了一些功能,这些功能可以抓取路由参数中指定的URL,进行GeoIP查找,规范化结果格式等。这可能需要几秒钟,具体取决于已爬网URL服务器的响应时间。

我想要实现的是,POST新网址以进行抓取的用户会立即获得对其请求的反馈(状态200 ="抓取请求已确认"),并且没有请求等待爬行完成。

我的想法是

  • 将URL发送到RabbitMQ中的特定队列,并有另一个进程来侦听队列的作业
  • 在Express Routes中使用类似子进程的内容

解决这个问题的最佳解决方案是什么?感谢您的宝贵意见。

1 个答案:

答案 0 :(得分:3)

一个非常负载的问题有很多选项,每个选项都对整个系统有自己的影响。不确定是否有正确的答案。这真的是一个偏好的问题和你感到舒服的事情。 IMO,我试着保持简单。添加另一个进程(RabbitMQ)意味着另一个软件包(甚至整个服务器)来管理,配置,许可和保护。

要考虑的一些事项。您的处理I / O大部分是绑定的还是CPU绑定的?如果您使用远程服务进行GeoIP查找,则可能更多I / O限制,这对于节点来说是完美的。为什么节点只通过以下方式处理所有内容:

process.nextTick(function() {
  // Do your lookup here
}

res.status(201).end();

然后使用像socket.io之类的东西将结果异步发送到客户端?

无论哪种方式,我建议您返回202 - Accepted,而不是200.