2014-08-27 124 views
0

我想自動根據待處理列表的大小來調整/縮小我的dynos。Autoscaling在Heroku實時Resque工作人員

我聽說HireFire,但縮放只是每分鐘進行一次,我需要它(幾乎)實時。

我想擴展我的dynos,以便掛起的列表總是空的。我正在考慮自己做(使用調度程序(延遲15秒)並使用Heroku API),因爲我不確定哪裏有什麼東西;如果不是的話,你是否知道任何可以發送電子郵件警報的監控工具,如果隊列長度超過固定大小? (類似於newrelic上的apdex)。

回答

1

潛在的自定義代碼解決方案如下。還有兩個可以進行Resque監控的New Relic系統。我不確定是否基於超出特定隊列大小發送電子郵件警報。使用resque hooks,您可以通過Papertrail或Loggly等服務輸出可能觸發電子郵件警報(或閒置,hipchat,pagerduty等)的日誌消息。這可能看起來像:

def after_enqueue_pending_check(*args) 
    job_count = Resque.info[:pending].to_i 
    if job_count > PENDING_THRESHOLD 
    Rails.logger.warn('pending queue threshold exceeded') 
    end 
end 

而不是註銷,你可以發送電子郵件,但如果沒有某種形式的速率限制,如果不確定隊列快速增長,你可以很容易就淹沒在電子郵件。

我不認爲有一個Heroku插件或其他服務可以實時進行縮放。有一個gem這將使用不推薦的Heroku API。您可以使用resque hooksHeroku platform-api來做到這一點。這個未經測試的示例使用heroku platform-api來上下調整「工作人員」dynos。就如同一個例子,我每三個待完成的工作就包括一名工人。如果沒有未完成的工作和沒有工作的工作,則每個工作人員的下調幅度只會將工人重置爲1。這並不理想,應該更新以適應您的需求。看到這裏,瞭解有關確保再縮減工人,你不會失去工作:有一個類似的問題,並已跑進「Hirefire」

https://www.hirefire.io/http://quickleft.com/blog/heroku-s-cedar-stack-will-kill-your-resque-workers

require 'platform-api' 

def after_enqueue_upscale(*args) 
    heroku = PlatformAPI.connect_oauth('OAUTH_TOKEN') 
    worker_count = heroku.formation.info('app-name','worker')["quantity"] 
    job_count = Resque.info[:pending].to_i 
    # one worker for every 3 jobs (minimum of 1) 
    new_worker_count = ((job_count/3) + 1).to_i 
    return if new_worker_count <= worker_count 
    heroku.formation.update('app-name', 'worker', {"quantity" => new_worker_count}) 
end 

def after_perform_downscale 
    heroku = PlatformAPI.connect_oauth('OAUTH_TOKEN') 
    if Resque.info[:pending].to_i == 0 && Resque.info[:working].to_i == 0 
     heroku.formation.update('app-name', 'worker', {"quantity" => 1}) 
    end 
end 
+0

Thx,但我並不是真的在尋找源代碼解決方案。我正在尋找縮放工具或監控工具;) – 2014-08-28 08:02:45

+0

Aha。我編輯了一個潛在的警報解決方案,但我不認爲有現成的產品可以滿足您的需求。 – 2014-08-28 15:31:33

相關問題