開源軟件已經成為許多大型網站的基本組成部分,隨著這些網站的逐步壯大,他們的網站架構和一些指導原則也出現在開發者們的面前,給予切實有用的指導和幫助。本文旨在介紹一些核心問題以及通過構建模塊來制作大型網站,實現最終目標。
這篇文章主要側重於Web系統,並且也適用於其他分布式系統。
Web分布式系統設計的原則
構建並運營一個可伸縮的Web站點或應用程序到底指的是什麼?在最初,僅是通過互聯網連接用戶和訪問遠程資源。
和大多數事情一樣,當構建一個Web服務時,需要提前抽出時間進行規劃。了解大型網站創建背後的注意事項以及權衡可能會給你帶來更加明智的決策,當你在創建小網站時。下面是設計大型Web系統時,需要注意的一些核心原則:
1.可用性
2.性能
3.可靠性
4.可擴展
5.易管理
6.成本
上面的這些原則給設計分布式Web架構提供了一定的基礎和理論指導。然而,它們也可能彼此相左,例如實現這個目標的代價是犧牲成本。一個簡單的例子:選擇地址容量,僅通過添加更多的服務器(可伸縮性),這個可能以易管理(你不得不操作額外的服務器)和成本作為代價(服務器價格)。
無論你想設計哪種類型的Web應用程序,這些原則都是非常重要的,甚至這些原則之間也會互相羁絆,做好它們之間的權衡也非常重要。
基礎
當涉及到系統架構問題時,這幾件事情是必須要考慮清楚的:什麼樣的模塊比較合適?如何把它們組合在一起?如何進行恰當地權衡?在擴大投資之前,它通常需要的並不是一個精明的商業命題,然而,一些深謀遠慮的設計可以幫你在未來節省大量的時間和資源。
討論的重點幾乎是構建所有大型Web應用程序的核心:服務、冗余、分區和故障處理能力。這裡的每個因素都會涉及到選擇和妥協,特別是前面所討論的那些原則。解釋這些核心的最佳辦法就是舉例子。
圖片托管應用程序
有時,你會在線上傳圖片,而一些大型網站需要托管和傳送大量的圖片,這對於構建一個具有成本效益、高可用性並具有低延時(快速檢索)的架構是一項挑戰。
在一個圖片系統中,用戶可以上傳圖片到一個中央服務器裡,通過網絡連接或API對這些圖片進行請求,就像Flickr或者Picasa。簡單點,我們就假設這個應用程序只包含兩個核心部分:上傳(寫)圖片和檢索圖片。圖片上傳時最好能夠做到高效,傳輸速度也是我們最關心的,當有人向圖片發出請求時(例如是一個Web頁面或其他應用程序)。這是非常相似的功能,提供Web服務或內容分發網絡(一個CDN服務器可以在許多地方存儲內容,所以無論是在地理上還是物理上都更加接近用戶,從而導致更快的性能)邊緣服務器。
該系統需要考慮的其他重要方面:
1.圖片存儲的數量是沒有限制的,所以存儲應具備可伸縮,另外圖片計算也需要考慮
2.下載/請求需要做到低延遲
3.用戶上傳一張圖片,那麼圖片就應該始終在那裡(圖片數據的可靠性)
4.系統應該易於維護(易管理)
5.由於圖片托管不會有太高的利潤空間,所以系統需要具備成本效益
圖1是個簡化的功能圖