在客户端等待时使用工作程序处理作业,并在完成时返回响应

时间:2013-04-21 20:47:58

标签: ruby-on-rails ruby delayed-job resque sidekiq

我正在使用Rails构建API,其中请求进入并且它们需要由在不同服务器上运行的工作者群集执行(这些工作者调用远程API并解析数据等...)。我将使用Sidekiq或Resque来处理它的排队/处理。

我的问题是客户端需要等待这种情况发生,并且控制器需要在客户端完成后将响应返回给客户端。我如何在控制器中处理这个?我们正在使用redis后端,因此我正在考虑订阅pub / sub频道并等待工作人员发布状态消息。如果控制器没有及时收到消息,则控制器将等待设定的时间段,然后向客户端返回“稍后再检查”响应。实现这一目标的最佳方式是什么,还是有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

不要让您的客户等待!如果您为长时间运行的作业设置控制器块,则会出现很多问题:

  • 其他程序可能会假设请求超时(代理,浏览器,脚本等)
  • 它使您的API端点成为拒绝服务的来源
  • 它要求您将更多的工程工作放入Web服务器(因为rails进程在处理阻塞调用时无法处理其他Web请求)

使用Sidekiq或Resque的部分原因是避免在http请求期间大量提升的控制器。

相反,后台作业应将其状态报告给数据库。然后,Web服务器应查询并从数据库返回客户端的最新状态。

如果客户需要更多即时反馈,您可以:

  • 让客户不断推荐
  • 向客户发布请求(如果API使用者是另一个网络服务器)
  • 使用其他协议机制(例如 - websockets)。