【问题标题】:How to send data to a client from a Resque worker?如何从 Resque 工作人员向客户端发送数据?
【发布时间】:2013-06-30 06:22:39
【问题描述】:

我有一个在 Heroku 上运行的 rails 应用程序。我正在尝试添加一个功能,让用户以 CSV 格式下载他们的一些数据。 CSV 文件很大(约 1-2 MB),生成速度很慢。为了不占用我的网络测功机,我将这些下载请求传递给工作测功机(使用 Resque),并在那里组装 CSV。我的 resque worker 看起来像这样。

class Downloader

  def self.perform(ids_to_download)
      models = Model.where(:id => ids_to_download)
      csv_data_for_client = models.to_csv 
  end

end

我想知道将 csv 文件发送回请求它的客户的最佳方式。

如果这段代码在 Rails 控制器中,这可以通过简单的send_data csv_data_for_client 来完成。不过,这种方法似乎不适用于 Resque 工作人员。

通过对 SO 和 Internet 上其他地方的研究,我似乎有几个选择。

  1. 直接从 Resque 工作人员发送数据(虽然我不确定这是否可行)
  2. 将数据保存到heroku文件系统,在控制器中检索,然后使用send_data发送
  3. 将其保存到数据库(postgresql),在控制器中检索它,然后使用send_data

任何人都可以提供有关最佳方式的建议吗?谢谢。

【问题讨论】:

    标签: ruby-on-rails postgresql heroku resque


    【解决方案1】:

    经过一番思考,我排除了选项 1 和 2。

    Re 1,我不知道如何将 csv 文件从 Resque 工作人员直接发送到客户端。

    Re 2,似乎也不可能将 csv 文件保存到 Heroku。 Heroku 的文档说each dyno has its own filesystem,并且这个文件系统只对拥有它的测功机可见。我的工人测功机无法读取或写入我的网络测功机的文件系统,反之亦然。所以这似乎也不是一个有前途的选择。

    这给我留下了选项 3,将 csv 文件保存到我的 worker dyno 中的数据库中,然后检索它并将其发送到我的 web dyno 中的客户端。

    我使用resque-status gem 为每个 csv 文件请求分配一个唯一的 id (uuid)。

    我创建了一个简单的模型来保存生成的 csv 文件,并将其与其 uuid 相关联。

    class DownloaderJobOutput < ActiveRecord::Base
      attr_accessible :file_to_download, :uuid
    end
    

    在我的 resque worker 中,构建 csv 文件后,我将其保存到我的数据库中。

    class Downloader
      @queue = :trial_downloader_queue
      include Resque::Plugins::Status
    
      def perform
        models = Model.where(:id => options["trial_ids"])
        csv = models.to_csv
        DownloaderJobOutput.create!( :uuid => self.uuid, :file_to_download => csv )
      end
    end
    

    当作业执行时,我从我的网络客户端轮询它以跟踪它的状态。完成后,我将其从数据库中取出并发送给客户端。

    【讨论】:

    • 只需使用 Paperclip 上传,如果配置为上传到 S3,那么它还应该保存对数据库中文件的引用。我试过这种方式,它就像一个魅力
    • 嗯。凉爽的。我从没听说过回形针。我会调查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2015-01-08
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2013-02-01
    • 2017-05-07
    相关资源
    最近更新 更多