分布式队列包含https请求/响应

时间:2013-01-26 03:20:47

标签: node.js queue task distributed

寻找有关如何执行以下操作的一些建议:

  1. 从网站接收某个长时间运行过程的请求(~10-30秒)
  2. 网站后端安排作业并放入分布式队列..可能是SQS / Kue / resque
  3. 工作人员将该作业从队列中取出并进行处理。商店的结果在某处。
  4. 网站后端订阅作业完成事件并获取已处理作业的结果。
  5. 网站后端根据任务结果关闭网站请求。
  6. 1,2和3都没问题。我只是觉得将排队任务的结果传递回后端很棘手,以便它可以关闭请求。

    从网站进行轮询不是一个选项 - 无论处理任务多长时间,请求都必须保持打开状态。我正在使用nodejs。

1 个答案:

答案 0 :(得分:1)

2 - 4都在服务器端发生。没有什么可以阻止您轮询结果的预期结果位置(在服务器端),然后在最终显示时返回结果。

  1. 客户端发送请求
  2. 服务器启动作业并开始轮询结果
  3. 结果返回,因此服务器端的轮询循环结束
  4. 服务器将结果发送回客户端
  5. 最终切断了客户端 - 服务器连接
  6. 如果作业完成后可以执行URL,则可以获得更高效的代码。在这种情况下,您的服务将有两个端点...一个用于客户端启动进程,另一个用于您的作业队列可以调用。

    1. 客户端发送请求
    2. 服务器启动作业...将响应回调保存在全局对象中,以便它不会被关闭(我假设这里有类似的表达式)

      openJobs.push({id:12345,res:res}); jobQueue.execute({id:12345,data:{...}});

    3. 当作业完成并保存结果时,请使用id

    4. 调用服务网址
    5. 您可以检查作业是否已完成并从openJobs列表中删除作业
    6. 完成原始回复

      openJob.res.send(数据);

    7. 这将发送数据并关闭原始客户端 - 服务器连接。

    8. 总体结果是你根本就没有轮询......这很酷。

      当然......在上述任何一种情况下,如果您的服务器在批处理中间关闭,您就会被搞砸......这就是为什么我会在这种情况下推荐类似socket.io的东西。您可以将作业的结果排在某处,而socket.io将轮询/等待列表上的回调,并在有新项目时推送到客户端。这样做更好,因为如果服务器崩溃没什么大不了的话 - 一旦服务器重新启动,客户端就会重新连接。