Express Routes 中较长 运行 任务的卸载策略

Offloading strategy for longer-running tasks in Express Routes

我有一个应用程序使用 Express 作为我的 REST API 的面向用户的框架,同时使用 RabbitMQ 对集群后端进行类似 RPC 的函数调用。另外,我使用 Q 来承诺我在路由中的所有工作量。

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

我想要实现的是,发布新的 URL 进行爬网的用户会立即得到对其请求的反馈(状态 200 = "Crawling request acknowledged"),而不是让请求等待爬行完成。

我的想法是

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

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

需要考虑的几件事。您的大部分处理是 I/O 绑定还是 CPU 绑定?如果您使用远程服务进行 GeoIP 查找,它可能会受到更多 I/O 的限制,这对节点来说是完美的。为什么不让节点通过以下方式处理所有事情:

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

res.status(201).end();

然后使用类似socket.io的方式将结果异步发送到客户端?

无论如何,我建议返回 202 - Accepted,而不是 200。