1

我正在被分成公共和管理部分的應用程序(部署到Heroku的)。管理部分中的一項主要任務(由少數用戶管理)正在上傳圖像。這些圖像可能非常大,需要處理成多種尺寸(某些非常大)。我正在處理圖像上傳客戶端,直接上傳到S3,然後使用Sidekiq處理圖像處理。這可以避免阻塞網絡測試儀和Unicorn超時問題。我應該如何管理工人的Heroku對於非經常性工作

的問題是,這意味着我需要一個工人測功機運行在任何時候,即使管理員會經常只上傳了幾個圖片的一天(雖然他們可以上傳多)。我最初的想法是使用Hirefire,但它只檢查隊列every minute(雖然在我的測試,似乎更接近每3分鐘)。一旦圖像被處理,管理員有完成的任務,所以我需要儘快處理它,所以這種延遲(與處理時間相結合)是不可接受的。

所以我在尋找,做如下的解決方案:

  1. 旋轉起來工人測功機,如果需要只要一個作業添加處理任何工作。
  2. 降速工人賽道,當隊列爲空。

Hirefire讓我一半在那裏(我不介意推遲下降 dyno)。

我有哪些選擇?

+1

讓我知道,如果你發現了什麼,這看起來真的很酷,我可以用這樣的事情爲好。感謝發佈 – 2014-12-01 17:31:40

回答

0

希望有人能拍下來,並提出一個更好的方法,但在這裏,在這個簡單的嘗試:

它使用Hirefire當隊列爲空拿工人賽道下來,並使用heroku-api寶石與Heroku交談。

初始化/ heroku.rb

require 'heroku-api' 

if Rails.env.production? || Rails.env.staging? 
    Rails.application.config.heroku = Heroku::API.new(api_key: ENV['HEROKU_API_KEY']) 
end 

應用程序/服務/ heroku_service.rb

require 'heroku-api' 

class HerokuService 

    def self.ensureWorker 
    if Rails.application.config.respond_to? :heroku 
     # spawn a worker if needed 
     Rails.application.config.heroku.post_ps_scale(ENV['HEROKU_APP_NAME'], 'worker', 1) 
    end 
    end 

end 

顯然,調用API的Heroku是阻止和測功機需要一些時間來旋轉起來,但它比單獨依靠HireFire要快得多。我想知道是否使用調度程序來產生一次性定期檢查隊列的dynos可能比使用Hirefire更好。例如,在晚上10點到早上6點之間不需要監視應用程序。

相關問題