2011-10-10 37 views
3

我想從擁有大規模生產系統的經驗豐富的Java專業人員那裏知道,需要做些什麼來構建Web應用程序來擴展每天可以處理一千萬個以上的請求?在Java中開發高度可擴展的Web應用程序需要做些什麼?

例如,如果需要進行某種緩存,那麼生產質量庫用於緩存?

+0

有**是關於這個主題**整本書。多本書。所以這個問題對於這種格式可能太寬泛了。 –

回答

3

這是一個很大的話題,不能輕易回答 - 通常需要針對特定​​類型的負載仔細設計非常大規模的應用程序,以便處理它們的特定類型的負載。

例如:如果您的架構主要處理只讀頁面視圖(易於通過複製大量廉價應用程序服務器進行擴展)與處理複雜財務事務(您需要某種方式協調大量的同時交易)。

幾點提示:

  • 體型橫向擴展 - 儘可能,你希望能夠通過增加更多廉價箱,實現您的可擴展性。您可以設計您的應用程序以適應此模型的能力越強。
  • 對可變狀態的協調變化最終會成爲您可擴展性的瓶頸,因爲它是一個無法縮放的東西,因爲您喜歡水平使用便宜的盒子。弄清楚這些變化是什麼,並據此進行設計。如果幸運的話,單個數據庫實例就足夠了。如果沒有,你到昂貴的數據庫集羣/過的NoSQL /高度自定義的數據存儲分層領土事務語義。
  • 使用經過驗證的庫/可擴展組件。例如用於高吞吐量通信的Netty
  • 不要在沒有專業知識在你的團隊試試這個 - 擴展應用到了「大聯盟」是困難,需要專業技能。如果你做錯了,你可能會遇到需要進行昂貴的重寫的瓶頸。僱用曾經做過的人。

BTW - 每天10萬個請求是實際上並沒有那麼大。這僅僅是每秒115個請求。有了合理嚴格的編碼,一個現代化的服務器就可以搞定......

2

最重要的是您的應用程序應該具有一定的可預測性。至於「如何」,如果沒有對需求和體系結構進行更深入的分析,這是不可能的。緩存通常是某種形式或其他形式的關鍵組件。取決於幾個因素,如數據的波動性和變化率,可以採取不同的方法。最簡單的方法是隻有本地緩存​​,但要記住緩存數據的更改不會立即反映到所有節點上,除非添加了一些緩存同步。另一方面,您擁有完全分佈式緩存,如Terracotta BigMemory或其他分佈式/集羣緩存解決方案。

我建議你儘早建立性能測試基線。這將允許您測試您正在開發的系統的可擴展性。針對一個,兩個,三個等負載均衡節點運行基準測試並測量吞吐量。還要標識所有節點之間必須共享的資源或數據,以及如何正確地同步這些資源或數據以實現最佳可伸縮性。

1

將通常通過編寫和維護大型應用程序所獲得的內容壓縮爲以論壇帖子形式出現的答案是非常困難的。通常,人們通過這種專業知識向其他人支付大量的金錢。

您需要了解應用程序的想法。一些陷阱在分析階段變得顯而易見,尤其是在基礎設施(什麼是在什麼地方服務),其他的則是數據處理(同步如何工作?)。

其他將在稍後出現,如「我們將在X崩潰時做什麼」(插入X的基礎結構的任何部分)。根據這些情況檢查並重新檢查恢復時間。

然後你寫下整個想法的各個部分,測試失敗情況和用例。最後,如果你認爲一切都已經想到,那麼你就把它交給一個和你一樣有經驗的人,甚至更多,然後寫下他們所看到的所有問題,測試他們的抱怨,並改變他們的組織結構。適應所有用例的應用和/或基礎設施。

相關問題