2011-07-06 30 views
20

我想知道是否有在生產環境中自動縮放DYNOS和工人在Heroku上有什麼好的解決方案(可能爲每個的不同的解決方案,因爲他們是相當無關的)服務。你/公司在使用什麼?寶石/爲自動縮放Heroku的DYNOS和工人

我發現很多的選擇,但他們都不真正成熟的生產環境。 有Heroscale,它似乎引入了一些延遲,因爲它不在本地運行,我也聽說過一些停機。有一些delayed_jobs的修改,這些修改很久沒有更新過,並且當前捆綁器存在一些問題。也有相關的reque一些替代品,這似乎並沒有很好地處理一些HTTP例外,這會導致應用程序崩潰,而另一些似乎需要一個始終運行的工作安排其他工人,也可能患上一些HTTP例外問題。

好吧。到底。目前,在使用Rails3對生產環境中的Heroku的工具和工作人員進行自動調節時,正在使用什麼?

在此先感謝。

回答

34

我們前一段時間遇到了這一點,我花了相當多的時間在這給我很大的挫折。我會盡力堅持突出點。乍一看,有幾款Heroku自動縮放解決方案看起來不錯。

已經給出heroku-autoscaler的例子實際上是用於自動縮放dynos,並且幾乎是唯一一個宣稱要做到這一點的解決方案(而且它肯定做得不好)。大多數人只會爲你自稱爲自動縮放工作人員。所以,我們先關注一下。您要爲工作人員看的自動壓縮機取決於您實際使用的背景工人的內容,例如delayed_jobresque。這些是人們使用的最常見的後臺處理庫,所以自動縮放器將嘗試將其綁定到其中一個庫中。你可以使用之類的東西:

一些對雪松這些工作的堆棧有些人可能需要一些調整。所有這些問題都是因爲它試圖通過自己的頭髮將自己從沼澤中拉出來。以Hirefire爲例(這可能是最好的一個)。它修改delayed_job,以便工人自己可以查看隊列並在必要時啓動更多工人,如果隊列中沒有更多工作,工人將全部關閉。有幾個問題:

    如果你想要把一個工作隊列
  • 在未來被執行,而不是現在就對了,你的運氣了。當工作進入隊列時,工人啓動,但由於工作將來將被執行,工人將關閉,並且除非另一工作進入隊列(這是唯一提示工人啓動的工作)
  • 您失去了重試失敗作業的能力,這在delay_job中是默認情況下可能的,但是如果失敗的作業多次失敗重試(並且逐漸變長),需要一段時間,但工作人員將關閉在這段時間內並沒有什麼促使他們再次啓動(在本質上,這是相同的問題,因爲在第一個場景)

,解決這個問題是有一個工人連續工作也可以的事情因此需要定期監視隊列可以在必要時執行工作,甚至可以騰出更多的工人。但是如果你這樣做了,那麼你沒有節省任何資金(你有一個工作人員連續24/7連續運行並且必須爲此付費),這就是在heroku上的自動縮放器背後的全部前提。實質上,如果您只有偶爾的後臺處理工作,或者您的後臺作業很可能會失敗,但會成功重試,或者您有後臺作業不需要立即執行,那麼就沒有可以自動擴展的庫使用它將爲你工​​作。

這裏有一個選擇。編寫Hirefire的人後來將其轉換成一個webapp(Hirefire app),其實質是爲你外部監控你的Heroku工人/指揮官,並根據需要啓動/關閉工人dynos。這是免費的測試版,但它現在花錢,比你爲24/7全天候運行的員工花費的錢要少,但如果你偶爾需要一些後臺工作,那麼它仍然不是微不足道的。無論哪種方式,這是唯一可行的方法,以確保您的後臺作業基礎設施做你想做的(以及滾動你自己的解決方案,這意味着有一臺機器就像一個EC2實例,你可以把一些腳本,將ping你的英雄應用程序和旋轉根據需要啓動/關閉工作人員 - 不費力氣)。

現在Hirefire應用程序確實也會爲您自動調整您的dynos,它會基於掛接到您的heroku請求隊列的延遲執行此操作。然而,我發現這樣做效果不好,也許如果你靠近你的heroku應用程序實際存在的亞馬遜數據中心(我們不是),那麼你可能會有不同的體驗。但是,對我們來說,無論我調整了多少設置,它都會不必要地分散了大量的dynos,並且永遠不會讓它們失效。你可以把它歸結爲它自那時起可能已經有所改進的一個測試版,但那是我的經驗。長話短說,如果你想自動調整你的工人,使用Hirefire應用程序,你會比你想象的節省更多的錢,但它仍然是最便宜的選擇。如果你想自動調整dynos,你基本上運氣不好。這只是爲了像Heroku這樣的平臺的便利而與之共存的限制之一。

+0

非常感謝,很好的回答。我稍後會給Hirefire一個去,如果我找到其他好的解決方案,我也會告訴你。 – FernandoH

+0

@Fernando你最終結伴了什麼? – user456584

+0

@skorks,我嘗試了一段時間heroku-autoscaler。它工作但不完美,我感覺不太好,因爲有些東西可以擴大耗費我的資源。最後,我放棄了通過這些自動縮放..你在考慮使用這些嗎?鑑於我在一年多以前嘗試過,現在可能有更好的解決方案,請告訴我,如果你找到任何! – FernandoH

2

我試圖找到自動伸縮賽道的太多的好辦法。

https://github.com/ddollar/heroku-autoscale做到這一點,但有一個關於它的不成熟的免責聲明。

+0

哦,我也發現了一個。由於該免責聲明,我有點不舒服,但稍後我會試一試:)謝謝 – FernandoH

+0

可能值得看看https://github.com/ddollar/heroku-autoscale/network上的叉子請分享一下否則你順便找到 – gunn

10

Heroku提供了一個名爲AdeptScale的新插件,現在剛剛Beta版。

Here is the add-on page for AdeptScale

Here is the more detailed documentation for AdeptScale

Here is the form to sign up for Heroku's Beta Program

希望這將是自動縮放的Heroku DYNOS一個強大的解決方案,因爲我不還是不滿意當前的選項。

更新(2/4/13):我註冊了Heroku的Beta程序來試用這個附加組件,它對我來說非常合適。偶爾會隨着交通量的增加而增加,但大多數情況下是坐在我設置的最小數量的dynos上。這大大減少了我的賬單,並且消除了在高峯使用時間期間可能會變慢的擔心。

更新(3/6/13):添加了Heroku註冊頁面的鏈接以獲取他們的測試版程序。

更新(4/14/13):看起來像自動縮放超出了測試版。它對我來說仍然非常好。

+0

你是如何註冊Heroku的Beta程序的? – simo

+0

以下是註冊表單:https://beta.heroku.com/signup –

3

HireFire.io(服務,而不是開放源代碼項目)現在允許您使用您的New Relic指標來自動縮放您的網絡dynos。 New Relic是一款性能監控工具,通過Heroku作爲附件提供。他們有一個免費的階層,這與HireFire一起使用就足夠了。

您可以根據自動縮放:

  • 響應時間
    • 這是響應時間,你在New Relic的主頁找到。它的各種因素,包括請求隊列,數據庫性能,應用層,路由器等組合
  • Apdex的分數
    • 這允許您根據New Relic的Apdex的分數,以規模化,使您能夠擴展基於用戶體驗/滿意度,由此得分確定。

拋開這一點,我們已經成爲語言/框架無關。對於工作人員dynos,您只需在應用程序的某個路徑中設置JSON終點,即可返回包含隊列大小的非常簡單的JSON字符串(我們提供方便但不是必需的宏)對於Ruby語言和對Django應用程序的一些開箱即用的支持,但正如我所說的,它可以通過手動設置JSON端點來適用於任何語言/框架 - 這非常簡單)。對於Web dynos,您可以使用基本上任何語言/框架的HireFire Metric Source,以及New Relic支持的語言/框架的上述New Relic Metric Source(這些是常見語言,如Ruby,Python,Java等) )。

聲明:我構建了HireFire。

+1

+1我是我的heroku Rails應用程序的快樂hirefire.io客戶。邁克爾對問題的反應非常敏感,而且僱傭關係做到了它所說的話 - 它現在甚至支持多個工人隊列的隊列。 –

1

我最近寫了一個名爲向量的Heroku Heroku上自動縮放系統:

https://github.com/wpeterson/heroku-vector

它可以讓你擴展基於不同流量來源的多種類型DYNOS的。它目前支持NewRelic和Sidekiq的繁忙線程數。隨着交通量的增加或減少,它將會增加或減少支架的數量。這是一個守護進程,可以在自己的Heroku或其他地方運行。