2013-02-11 201 views
6

我有一個Rails應用程序的N個dynos,並且我想對它們運行一個命令。有沒有辦法做到這一點?在所有的dynos上執行rails r "SomeRubyCode"會執行嗎?有沒有辦法在所有Heroku dynos上運行命令?

我正在使用一個插件,每M分鐘與第三方同步。問題是,有時第三方服務會超時,我想再次運行它,而不必等待另外的M分鐘。

+1

您的用例描述在這裏最有用。 – hgmnz 2013-02-15 19:30:24

+0

我正在使用每N分鐘與第三方同步的插件。問題是,有時第三方服務會超時,我想再次運行它,而不必等待另外N分鐘的時間。 – Geo 2013-02-15 19:51:15

+1

如何使用Redis作爲共享/分佈式內存(在應用程序級而不是插件級)?有一個計劃的rake任務「強制」插件同步並將結果存儲在緩存中,然後讓應用的其餘部分從緩存中獲取數據。如果同步失敗,您可以手動運行rake任務,而不用擔心運行哪個dyno。 – 2013-02-18 02:29:05

回答

4

(問把我的意見變成一個答案......將藉此機會闡述。)

我不知道你的插件,需要做的,「同步」到一個什麼樣的細節第三方服務,但我將繼續假設插件基本上獲取Web應用程序以某種方式使用的一些臨時數據。

由於同步或讀取過程偶爾會失敗,並且您的Web應用程序依賴最新的數據,因此您需要手動運行「同步」過程的選項。目前,只有這樣才能從插件本身做到這一點,這意味着您需要在所有的dynos上運行一些代碼,正如其他人所指出的那樣,目前不可能。

我在以前,類似的情況做了什麼(從外部服務獲取分析)很簡單:

  1. 提供和使用Redis的
  2. 配置你的Heroku應用程序編寫簡單地執行rake任務然後將該數據寫入緩存中
  3. 通常在應用程序中獲取數據的位置,首先嚐試從緩存中獲取數據(並在緩存未命中時,只需再次運行相同的代碼 - 僅表示數據在刷新之前已從緩存中過期)

然後我進一步去和使用Heroku的簡單的調度,以執行所述搜索任務每ň分鐘試圖保持數據新鮮更新,並始終處於高速緩存(緩存過期設置爲略小於ñ分鐘),並減少發生數據獲取時可感知滯後的情況。我可以將緩存過期設置爲從不或大於n但這不是關鍵任務。

這樣,如果我沒有要確保被顯示的最新分析,我不得不這樣做要麼是一個)連接到Redis的和從緩存中,或刪除的項目(容易),B)只是heroku run rake task

再說一遍 - 如果你只是拉取需要在所有dynos之間共享的數據,這主要起作用。

這顯然不能反其道而行。例如,如果您有一個集中式服務,您希望定期發送指標(比如說,每個請求花費的時間)以逐個測試者爲基礎。想不到使用Heroku的簡單而優雅的方式(除了實時,還有所有需要的開銷)。

相關問題