Rails中的前景或背景图像处理(Jruby,Torquebox)

时间:2015-02-23 03:00:56

标签: ruby-on-rails amazon-s3 jruby jrubyonrails torquebox

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

1 个答案:

答案 0 :(得分:1)

通常认为在对第三方服务的网络请求上阻止Web请求处理程序是不好的做法。如果该服务变得缓慢或不可用,这可能会堵塞您的所有Web进程,无论您使用什么ruby。这就是你所说的'前景'。

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

  1. 用户在您的网站上传图像,您所需的控制器会收到请求。
  2. 您的控制器向s3发出同步请求。这是阻止请求。
  3. 您的控制器等待
  4. 您的控制器等待
  5. 您的控制器(继续)等待
  6. 最后,(并且无法保证)您收到来自s3的回复,您的代码将继续并呈现您的给定视图/ json / text / etc.
  7. 显然,步骤3-5对于您的服务器来说是个坏消息,正如我之前所说,这个worker / thread / process(取决于您的ruby / rails服务器框架)将被“保留”,直到s3的响应为止收到(可能永远不会发生)。

    这是与后台作业相同的流程,前端有一些javascript帮助通知:

    1. 用户在您的网站上传图像,您所需的控制器会收到请求。
    2. 您的控制器会创建新线程/进程以向s3发出请求。这是非阻止方法。您在引用s3图像src的记录上设置了一个标记,例如completed:false,代码继续很好地继续执行第3步。您的新线程/进程将是等待s3响应的线程/进程,当s3响应时,您将'completed'标志设置为true。
    3. 你渲染你的view / json / text / etc,并且固有地释放你的工人/线程/进程来处理这个请求......好消息!
    4. 现在有趣的前端:

      1. 您的客户端收到您的响应,触发您的前端javascript以启动类似setInterval的重复功能,每隔3秒钟“ping”您的服务器,后端控制器会检查“已完成”标志你之前设置的是真的,如果是,则回复/渲染为真。
      2. 您的客户端javascript收到您的回复,并继续ping(直到您指定它应该放弃)或停止ping,因为您的应用回复了真。
      3. 我希望这能让你走上正确的道路。我认为为这个答案编写代码是低劣的,因为它似乎是你在寻找利弊。对于实际的实现想法,我将研究以下内容:

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