2014-02-26 66 views
1

我正在嘗試擴展應用程序服務器以處理每分鐘超過20,000個請求。如何在每分鐘內處理很多請求的同時在Rails中創建HTTP請求?

當我壓力測試請求時,大多數請求很容易處理20,000 RPM或更多。

但是,這需要進行外部HTTP請求(例如,Facebook登錄)關閉服務器如蝸牛(3000 RPM)的請求。

我概念理解我目前的環境的限制 - 每個服務器4名麒麟工人3負載平衡服務器只能同時處理12名的請求,即使所有的人都在等待HTTP請求。

我的選擇是什麼讓這個更好?我想一次處理更多的連接。

可能的解決方案我的理解:

  1. 蠻力:多采用麒麟工人(即,更多RAM)和更多的服務器。

  2. 推動所有的阻塞操作到後臺/工作進程,以釋放網絡的進程。客戶需要定期輪詢,以確定他們的請求何時完成。

  3. 移動到彪馬而不是獨角獸(可能是來自MRI的Rubinius),這樣我可以使用線程而不是進程 - 這可能會(?)提高每個連接的內存使用量,因此允許工人數量增加。

從根本上說,就是我正在尋找的是:是否有更好的方式來增加阻塞數/排隊請求一個工人可以處理這樣我就可以增加每個服務器的連接數?

例如,我聽說過使用Thin with EventMachine進行討論。這是否會打開一個Rails工作者的可能性,它可以放下它當前正在處理的Web請求(因爲那個人正在等待外部服務器),然後在等待的時候接收到另一個請求?如果是這樣,與獨角獸和彪馬相比,這是追求性能的有效途徑嗎? (是否在很大程度上取決於應用程序的運行時的活動?)

回答

2

獨角獸是單線程,多進程同步的應用服務器。這種處理不太適合。

這聽起來像你的應用程序是I/O綁定。這提供了一個面向事件的守護進程來處理你的請求。

我建議你嘗試EventMachine的和EM-HTTP請求和em-http-server

這將允許你傳入的請求HTTP服務器和傳出的HTTP服務的服務調用中異步。