0

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

  1. 接收来自网站的特定长时间运行进程的请求(~10-30 秒)
  2. 网站后端安排作业并放入分布式队列..可能是 SQS/Kue/resque
  3. 工作人员将作业从队列中取出并进行处理。将结果存储在某处。
  4. 网站后端订阅作业完成事件并获取已处理作业的结果。
  5. 网站后端使用任务结果关闭对网站的请求。

1,2和3没问题。我只是发现将排队任务的结果传递回后端以便它可以关闭请求很棘手。

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

4

1 回答 1

1

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

  1. 客户端发送请求
  2. 服务器启动作业并开始轮询结果
  3. 结果返回,因此服务器端的轮询循环结束
  4. 服务器将结果发送回客户端
  5. 客户端-服务器连接终于被切断了

如果作业可以在完成时执行一个 url,那么您可以获得更高效的代码。在这种情况下,您的服务将有两个端点……一个供客户端启动进程,另一个供您的作业队列调用。

  1. 客户端发送请求
  2. 服务器开始工作......将响应回调保存在一个全局对象中,这样它就不会关闭(我假设这里是 express 的东西)

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

  3. 作业完成并保存结果后,使用 id 调用服务 url

  4. 您可以检查作业是否已实际完成并从 openJobs 列表中删除该作业
  5. 完成原始响应

    openJob.res.send(数据);

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

总体结果是您根本没有投票……这很酷。

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

于 2013-01-26T09:10:05.660 回答