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"),而不是让请求等待爬行完成。
我的想法是
- 将 URL 发送到 RabbitMQ 中的特定队列,并让另一个进程监听队列的作业
- 在 Express Routes 中使用子进程之类的东西
解决这个问题的最佳方案是什么?感谢您的宝贵意见。
一个非常繁琐的问题有很多选项,每个选项对整个系统都有自己的影响。不确定是否有正确答案。这真的是一个偏好问题和你觉得舒服的问题。 IMO,我会尽量保持简单。添加另一个进程 (RabbitMQ) 意味着要管理、配置、许可和保护另一个软件包(甚至整个服务器)。
需要考虑的几件事。您的大部分处理是 I/O 绑定还是 CPU 绑定?如果您使用远程服务进行 GeoIP 查找,它可能会受到更多 I/O 的限制,这对节点来说是完美的。为什么不让节点通过以下方式处理所有事情:
process.nextTick(function() {
// Do your lookup here
}
res.status(201).end();
然后使用类似socket.io的方式将结果异步发送到客户端?
无论如何,我建议返回 202 - Accepted,而不是 200。
我有一个应用程序使用 Express 作为我的 REST API 的面向用户的框架,同时使用 RabbitMQ 对集群后端进行类似 RPC 的函数调用。另外,我使用 Q 来承诺我在路由中的所有工作量。
在我使用的其中一条路线中,我触发了一些功能,这些功能会抓取路线参数中指定的 URL、执行 GeoIP 查找、规范化结果格式等。这可能需要几秒钟,具体取决于已抓取 URL 的服务器的响应时间。
我想要实现的是,发布新的 URL 进行爬网的用户会立即得到对其请求的反馈(状态 200 = "Crawling request acknowledged"),而不是让请求等待爬行完成。
我的想法是
- 将 URL 发送到 RabbitMQ 中的特定队列,并让另一个进程监听队列的作业
- 在 Express Routes 中使用子进程之类的东西
解决这个问题的最佳方案是什么?感谢您的宝贵意见。
一个非常繁琐的问题有很多选项,每个选项对整个系统都有自己的影响。不确定是否有正确答案。这真的是一个偏好问题和你觉得舒服的问题。 IMO,我会尽量保持简单。添加另一个进程 (RabbitMQ) 意味着要管理、配置、许可和保护另一个软件包(甚至整个服务器)。
需要考虑的几件事。您的大部分处理是 I/O 绑定还是 CPU 绑定?如果您使用远程服务进行 GeoIP 查找,它可能会受到更多 I/O 的限制,这对节点来说是完美的。为什么不让节点通过以下方式处理所有事情:
process.nextTick(function() {
// Do your lookup here
}
res.status(201).end();
然后使用类似socket.io的方式将结果异步发送到客户端?
无论如何,我建议返回 202 - Accepted,而不是 200。