代码之家  ›  专栏  ›  技术社区  ›  Tobi

快速路线中较长运行任务的卸载策略

  •  2
  • Tobi  · 技术社区  · 9 年前

    我有一个应用程序,它使用Express作为REST API的面向用户的框架,并使用RabbitMQ对集群后端进行类似RPC的函数调用。此外,我使用Q来承诺Routes中的所有工作负载。

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

    我希望实现的是,张贴新URL以进行爬网的用户会立即收到其请求的反馈(状态200=“爬网请求已确认”),而不会让请求等待爬网完成。

    我的想法是

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

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

    1 回复  |  直到 9 年前
        1
  •  3
  •   barefootsanders    9 年前

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

    有几件事需要考虑。您的大部分处理I/O受限制还是CPU受限制?如果您正在使用远程服务来执行GeoIP查找,则可能需要更多的I/O绑定,这非常适合节点。为什么不让节点通过以下方式处理一切:

    process.nextTick(function() {
      // Do your lookup here
    }
    
    res.status(201).end();
    

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

    不管怎样,我建议返回 202 - Accepted ,而不是200。