2013-06-25 102 views
1

我有一個在Heroku上運行的Rails應用程序。我試圖添加一項功能,讓用戶以CSV格式下載一些數據。 CSV文件很大(〜1-2 MB),並且生成速度很慢。所以爲了不綁定我的網絡dynos,我將這些下載請求傳遞給工人dynos(使用Resque),並在那裏組裝CSV。我的工作人員看起來像這樣。如何從Resque工作人員向客戶端發送數據?

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和互聯網上的其他地方看,我似乎有幾個選擇。

  1. 直接從Resque工人
  2. 保存數據發送數據(雖然我不知道這是不可能的)Heroku的文件系統,在控制器檢索,然後用send_data
  3. 發送
  4. 將它保存到數據庫(PostgreSQL的),在控制器檢索,然後用send_data

任何人都可以提供建議的最佳方式進行?謝謝。

回答

0

做一些思前想後,我排除選項1和2

回覆1,我無法弄清楚如何將CSV文件直接從Resque工人發送到客戶端。

Re 2,將csv文件保存到Heroku似乎也不可能。 Heroku的文檔說each dyno has its own filesystem,並且這個文件系統只對擁有它的dyno可見。我的工人dyno無法讀取或寫入我的web dyno的文件系統,反之亦然。所以這似乎也不是一個有前途的選擇。

這給我留下了選項3,節省了我的工人賽道csv文件到我的數據庫,然後檢索,並在我的網頁測功機將其發送給客戶端。

我用resque-status寶石指定一個唯一的ID(UUID)到每個csv文件請求。

我創建了一個簡單的模型來保存生成的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客戶端對它進行了輪詢以跟蹤其狀態。完成後,我將其從數據庫中取出併發送給客戶端。

+0

只需使用Paperclip上傳,如果它被配置爲上傳到S3,那麼它也應該保存對數據庫文件的引用。我試過這種方式,就像一個魅力 –

+0

呵呵。涼。我從來沒有聽說過回形針。我會研究它。 –

相關問題