Rails 中的前景或背景图像操作(Jruby、Torquebox)

Foreground or background image manipulations in Rails (Jruby, Torquebox)

我用 ajax 上传照片,操作和上传到 s3 需要很多时间。我听说最好在后台完成这些任务。我的应用程序需要等待照片上传。但是,如果我选择后台方式,那么我将需要使用 websockets 或重复 ajax 来检查结果(链接到 s3)(我对此并不满意)。 为什么在控制器(前台)中进行硬计算太糟糕了? 现在我使用 Torquebox(Jruby),据我所知,它具有完美的并发性。这是否意味着等待上传到 s3 不会占用资源并且一切正常? 请根据我的情况写下 back/fore 地面的优缺点。谢谢!

在向第三方服务发出网络请求时阻止 Web 请求处理程序通常被认为是不好的做法。如果该服务变慢或不可用,这可能会阻塞您所有的 Web 进程,无论您使用什么 ruby。这就是您所说的 'foreground.'

基本上这是您当前设置的流程(在前台):

  1. 用户在您的网站上上传了一张图片,您想要的控制器收到了请求。
  2. 您的控制器向 s3 发出 同步 请求。这是一个阻塞请求。
  3. 您的控制器正在等待
  4. 您的控制器正在等待
  5. 您的控制器(继续)等待
  6. 最后,(并不能保证)您会收到来自 s3 的响应,并且您的代码会继续并呈现给定的 view/json/text/etc。

显然第 3-5 步对您的服务器来说是个坏消息,正如我之前所说,此 worker/thread/process(取决于您的 ruby/rails 服务器框架)将 'held up' 直到收到来自 s3 的响应(这可能永远不会发生)。

这里是带有后台作业的相同流程,在前端有一些 javascript 帮助用于通知:

  1. 用户在您的网站上上传了一张图片,您想要的控制器收到了请求。
  2. 您的控制器创建一个 new thread/process 来向 s3 发出请求。这是一种 非阻塞 方法。您在引用您的 s3 图像 src 的记录上设置了一个标志,例如 completed: false 并且您的 代码很好地继续到步骤 3。您的新 thread/process 将成为等待 s3 响应的那个,您将在 s3 响应时将 'completed' 标志设置为 true。
  3. 您呈现您的 view/json/text/etc,并且固有地 释放您的 worker/thread/process 为此请求...好消息!

现在开始有趣的前端内容:

  1. 您的客户端收到您的响应,触发您的前端 javascript 启动类似 setInterval 的重复函数,'pings' 您的服务器每 3 秒检查一次,后端控制器会在此处检查查看您之前设置的 'completed' 标志是否为真,如果是,则 respond/render 为真。
  2. 您的客户端 javascript 收到您的响应并继续 ping(直到您指定它应该放弃)或停止 ping,因为您的应用响应为真。

我希望这能让您走上正确的道路。我认为为这个答案编写代码是次等的,因为您似乎在寻找利弊。对于实际的实施想法,我会研究以下内容:

  • sidekiq 非常适合解决此处描述的后台作业问题。它将处理创建新进程,您可以在其中向 s3 发出请求。
  • 这里有一个很好的 railscast 可以帮助您更好地理解代码。