【问题标题】:How to save a record using a background worker?如何使用后台工作人员保存记录?
【发布时间】:2011-06-26 19:36:59
【问题描述】:

如果我将大于 5mb 的视频文件保存到服务器上。我应该创建一个后台作业来保存这个文件吗?

这应该怎么做?我的视频模型有标题、描述和附件列/字段。所有字段都是必需的。

在 def create 中,我应该执行 "if Resque.enqueue(Save, @video)" 之类的操作,而不是执行 "if @video.save"

我不确定如何做到这一点,因为将参数传递给 Resque.enqueue() 会将其转换为哈希。其次,使用 ""if Resque.enqueue(Save, @video)"",期望 true 或 false。然而,Resque.enqueue 不能返回任何东西。还是我错了?

按钮线是。使用 resque + redis 的后台工作人员保存记录的适当方法是什么?

理想情况下,我认为它应该类似于:

def create
  @video = Video.new(params[:video])

  respond_to do |format|
    if Resque.enqueue(Save)
      ...
    end
end

module Save
  @queue = :save

  def self.perform
    video = Video.new(params[:video])
    video.save
    return true
  end
end

你有什么想法?

【问题讨论】:

    标签: ruby-on-rails backgroundworker redis resque


    【解决方案1】:

    再次意识到情况。我不认为上传者意味着要延迟工作..考虑一下。如果上传文件排在第 10 位会发生什么情况。它期望从哪里获取文件?

    正如另一位开发人员所引用的那样:“有 HTTP 请求处理程序,只有后台进程。您需要在 http 请求处理程序中处理原始上传,然后您可以启动外部后台进程将其从本地上传到 S3磁盘”。

    也就是说,最初运行一些 HTTP 请求处理程序来处理这些类型的请求是很正常的。

    希望这能为最终遇到同样问题的用户解决一些问题。

    【讨论】:

      【解决方案2】:

      我会让用户上传 UnencodedVideo。然后,在它的 create 方法上,它启动一个对视频进行编码的作业(使用 resque/delayedjobs),这将创建一个 Video。

      class UnencodedVideo
        def after_create
          Resque.enqueue(Encoder, this.id)
        end
      end
      
      class Encoder
        def self.perform(unencoded_video_id)
          unencoded_video = UnencodedVideo.find(unencoded_video_id)
          ...
          video.save
        end
      end
      
      class Video
      end
      

      【讨论】:

      • 嗨,杰西,是的,我现在就是这样。但是,如果我允许最终用户先上传未编码的视频,那么这将占用一个过程。所以基本上,如果我有 2 个用户浏览该网站。用户 foobar 决定上传。然后应用程序冻结,直到 foobar 的上传完成。使第二个用户无法使用该应用程序。或不?我的虚拟主机是 Heroku。在这种特殊情况下,我需要 > 1 dynos。我说的对吗?
      • 啊,好的,所以问题是上传,对吧?您应该让用户直接上传到 S3,然后在后台处理它。阅读devcenter.heroku.com/articles/s3github.com/nathancolgate/s3-swf-upload-plugin
      • 嗨,杰西。是的,我们已经上传到 S3。您建议的链接仍在前台执行所有操作。这仍然会占用一个测功机/每个上传/每个用户。我只需要知道,如果最终用户上传,我是否应该将其作为后台作业?普遍的共识是什么?我们希望我们的应用程序中有多个用户在任何给定时间上传视频内容。同时运行多个测功机非常昂贵。我宁愿为此做一份背景工作。还是我错过了什么?
      • Christian -- S3 上传器将直接上传到 S3。正常路径是上传到服务器,服务器post到s3。这样可以使您的服务器保持响应,而无需上传到 heroku。
      • 嗨,杰西,但就是这样。直接上传到 S3 并不意味着它发生在后台。它仍然占用一个 Web 进程
      猜你喜欢
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多