2012-09-01 97 views
2

我最近閱讀的SoundCloud球隊做出了巨大的博客文章。本文討論了軟件體系結構的演變。的Apache +乘客== HAProxy的+ Mogrel服務器(M/M/C排隊)

http://backstage.soundcloud.com/2012/08/evolution-of-soundclouds-architecture/

在部分「負載分配和一點點排隊論」肖恩·特雷德韋,大約排隊論,以及如何更好地使用隊列會談。

他寫道:

我們希望,從來沒有排隊系統,但是如果它沒有排隊,等待時間 隊列中是最小的。以M/M/c模式爲極限,我們問自己「我們如何使c儘可能大?」

要做到這一點,我們需要確保單個Rails應用程序 服務器永遠不會收到同時

我們增加HAProxy的進入我們的基礎設施,配置每個後端有一個最大連接數> 1,並加入我們的後端流程的所有主機,以獲得>那美妙的M/M/C還原多個請求任何主機上排隊的HTTP請求,直到任何後臺駐留程序等待時間變得可用

顯然,他們正在使用HAProxy + Rails服務器(也許是Mongrel)。 好的,HAProxy會傳入請求並只在可用時調度到Mogrel/Thin。

也許我可能是完全錯誤的),但是Apache +乘客做同樣的事情,對不對? 一個隊列(Apache處理傳入請求)和C工作人員(子進程)

回答

0

Apache + Passenger確實將傳入的請求分發到機架後端(除非請求引用靜態資源,apache自己處理)。

這個模型的工作只要一臺主機可以運行所有(!)機架實例。當你需要更多的實例時,apache無法處理它,你將不得不把它放在頂部(通常是HAProxy)。但是,然後,Apache的功能遠遠大於只提供基於機架的應用程序。因此,將它替換爲更輕量級的東西(例如nginx)是有道理的,尤其是因爲您爲每個主機都部署一次。

我希望幫助一點點。

+0

感謝@mosch。 「當你需要更多的實例時,apache不能處理它,你將不得不把東西放在頂部」意味着當乘客池中沒有可用的孩子時,apache將清除傳入的請求? apache沒有入隊嗎? – CHAPa

+1

我的意思是我不知道如何讓apache將傳入的請求分發給不同的主機。乘客正在處理單個主機和幾個機架應用程序(這意味着乘客池在本地主機上),但它不會中繼到不同的主機(AFAIK)。 – moritz