我有一个应用程序,它使用Express作为我的REST API的用户界面框架,并使用RabbitMQ对集群后端进行类似RPC的函数调用。此外,我使用Q来承诺我在Routes中的所有工作量。
在我使用的一个Routes中,我触发了一些功能,这些功能可以抓取Route参数中指定的URL,进行GeoIP查找,规范结果格式等。这可能需要几秒钟的时间,具体取决于抓取的URL服务器的响应时间。
我想实现的是,张贴新URL进行爬网的用户可以立即获得对其请求的反馈(状态200="爬网请求已确认"),而无需等待爬网完成请求。
我的想法要么是
- 将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。