1

我正在使用 Rails 构建一个 API,请求进来,它们需要由运行在不同服务器上的一组工作人员执行(这些工作人员调用远程 API 并解析数据等)。我将使用 Sidekiq 或 Resque 来处理队列/处理。

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

4

1 回答 1

3

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

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

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

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

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

  • 让客户不断轮询
  • 向客户端发布请求(如果 API 使用者是另一个网络服务器)
  • 使用另一种协议机制(例如 - websockets)。
于 2013-04-21T21:00:43.923 回答