ruby-on-rails - 如何从 Resque worker 向客户端发送数据?

标签 ruby-on-rails postgresql heroku resque

我有一个在 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 Controller 中,则只需使用 send_data csv_data_for_client 即可完成。不过,这种方法似乎不适用于 Resque 工作人员。

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

  1. 直接从 Resque worker 发送数据(虽然我不确定这是否可能)
  2. 将数据保存到 heroku 文件系统,在 Controller 中检索它,然后使用 send_data 发送它
  3. 将它保存到数据库(postgresql),在 Controller 中检索它,然后使用send_data

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

最佳答案

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

关于 1,我无法弄清楚如何将 csv 文件从 Resque worker 直接发送到客户端。

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

这给我留下了选项 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

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

关于ruby-on-rails - 如何从 Resque worker 向客户端发送数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17288876/

相关文章:

sql - 具有绑定(bind)参数的用户定义函数

python - 如何在 SQLAlchemy 中连接两个表中的数据?

python - Django heroku 上传文件

ruby-on-rails - 寻找应用程序(ruby 2.3.8,rails 4.2.11)到最新稳定版本的 ruby​​ 和 rails 的推荐升级路径

ruby-on-rails - Apache 对 POST 请求大小的限制

ruby-on-rails - 规范/邮件程序/预览中不提供Rails邮件程序预览

ruby-on-rails - 在 Heroku 上充当标签

ruby-on-rails - 防止应用程序路由阻塞 Rails 3 中的插件路由

sql - 为什么仅索引扫描需要这么长时间?

node.js - Heroku+Node.js 如何克隆node_modules?