焦花花
摘 要:一個網站系統在需求確定后,就可以開始架構設計了。架構設計不同于編寫代碼,需要遵循嚴格的語法和編程規范。它沒有規范可遵循,存在即合理,適合網站系統開發和運行的架構就是最合理的系統架構。
關鍵詞:網站;系統;架構;部署
對于一網站系統,根據數據量或者邏輯的復雜性會有不同的架構上的設計。也可以根據用戶量的多少來對不同系統采取不同的設計。對于一個系統,根據用戶的使用情況,可以分為幾個常見的用戶級別系統。分別是萬級用戶的系統、十萬級的用戶系統和百萬級別的用戶系統。這三種級別的用戶量在系統的設計和應用的部署上會有不同的方式。接下來,我們分別介紹這三種級別系統在設計上和部署方式上的不同。
1一萬用戶量的系統
用戶量不超過一萬的系統應該是最簡單的系統了,對于這種簡單的系統應用程序的部署包、文件的存放、還有數據的安裝都可以放在一臺服務器上即可,不會影響系統的功能使用和性能。
在應用程序上,基本上使用一套java的SSM/SSH框架就可以完成相應的業務功能了。一些復雜的統計需要sql語句即可。然后在數據庫連接池的配置上修改下參數。因為用戶量使用的少,只要能實現需求的功能。用戶量較少一般產生的數據也比較少。因此數據的存放和應用可以放在同一個服務器上。
2十萬用戶網站架構
用戶使用量不超過十萬的系統結構,用戶量較多,一般會產生較多的數據。如果數據存放和應用公用一臺服務器,隨著數據量的增多,會占用服務器的更多的資源。因此需要將部署應用程序的服務器、存放文件的服務器、存放數據的服務器獨立出來。
實現應用程序和數據的分離,不僅在邏輯上的分離,在物理上也實現了分離。
2.1服務器的合理選擇
對于應用程序的服務器,主要用來處理業務邏輯,對硬件的要求是需要好點的cpu。對于存儲文件的服務器,需要較大的硬盤,對于存放數據的數據庫服務器,它的任務是做了大量的數據緩存和對磁盤進行檢索,因此需要硬盤讀寫速度比較快的,另外需要大的內存。
2.2程序的設計與優化
在應用程序的設計上,主要對業務中的數據的批量處理和統計上的改進。Hibernate框架寫的速度每分鐘兩千條,如果需要處理10w條數據,使用java語言,提交批處理的sql語句,每秒可以處理5萬條數據。Oracle數據庫每秒可以修改5w條數據的狀態。簡單的業務可以用批處理sql語句來解決問題,復雜的需要批量操作的業務,就無法通過簡單的批處理的sql來解決。需要使用消息隊列機制,它是解決批量數據、大數據的通用方案。MQ實現了批量數據處理與業務的分離,實現對程序的解耦。
Tomcat支持的線程數是200到300之間,十萬級用戶,如果每個用戶一天請求50次,按照十小時算的話,每秒需要請求服務數是139次,如果峰值翻倍的話,也在tomcat的最大并發數承受范圍內。因此應用服務器選用tomcat即可。
3百萬用戶網站架構
現實中絕大多數的系統的用戶量是達不到百萬級用戶的,這種級別的系統業務是比較復雜的,使用分布式技術、緩存技術和負載均衡技術等。因此系統架構也比較復雜些。
3.1應用服務器的設計
負載均衡服務器統一管理著系統的入口和出口。百萬級別用戶的系統,負載均衡服務器選用nginx。它可以最高支持5萬的并發數。雖然是百萬級別的用戶數,但在某一時刻的并發量可能就是幾萬。因此,一臺nginx完全可以支撐百萬級別用戶的負載均衡。相比于apache和tomcat服務器,ngnix做負載服務器是較好的選擇。
應用服務器上主要部署的是應用程序、本地的一些數據緩存、還有數據的訪問模塊功能。應用程序可選用tomcat即可,因為應用程序可做集群,保持與其他模塊的耦合性。本地的緩存可以存儲一些數據量不大的數據,但經常需要訪問當的數據即可,像session這種,因為百萬級別的用戶量,雖然每一個的session占用空間不大,但是百萬個seeeion就需要很大的空間,因此seesion建議存儲在遠程分布式緩存中,目前常用的遠程分布式緩存有Redis和Memcached。Redis可以支持的數據結構更多些,而memchached只是支持key-value的結構。而且redis可以處理簡單的業務邏輯,做消息隊列代理等。因此遠程緩存服務器選redis。
數據庫訪問的模塊,因為數據量比較大,而且傳統的關系型數據庫對表數據是行級鎖的,即讀一張表或寫一張表數據,會形成阻塞的。因此建議,數據庫做主從備份,將數據的讀和寫分開。Spring框架和中間件都可以做對數據庫的讀寫分離。
3.2文件服務器
常用的存儲文件的有HDFS和FDHS,這兩種在網上的資料都比較多,是比較成熟的存儲系統了。關于文件系統的使用基本上都是一樣的,用戶將文件上傳到應用服務器上,經過程序的處理,將文件存在文件系上,文件系統給應用服務器回一個存儲的路徑。應用服務器將路徑告訴客戶端,客戶端就可以直接去文件系統上讀取處理過的文件了。相對獨立,和其它服務器上的耦合度較低。
3.3數據庫服務器
在系統設計上采用緩存技術,可以減少程序直接讀取數據庫,可以減少數據訪問的壓力。不需要實時的數據可以先緩存在緩存中,然后使用批量提交技術同步到數據庫中。除非是一些需要實時更新的信息,需要立即訪問數據庫。緩存技術可以帶來系統性能上很大的改善。百萬級別的數據需要對數據庫的操作進行讀寫分離。
目前的市面上的關系型數據庫都是采用行級鎖的,當同時對同一張表的數據進行寫入操作和查詢操作時,是會有線程阻塞的,當嚴重阻塞時,會使降低系統的性能,甚至讓系統掛掉的;對數據采用讀寫分離后,主庫主要用來寫,減少查詢的系數,降低阻塞。而從庫只有查詢操作,不存在阻塞的。這樣將主從數據庫服務器的性能發揮到最大,而且也比較的穩定。另外對數據的安全也有所保證了。因此,百萬級別的系統相比十萬級別的系統主要上的改變就是對數據庫的設計做讀寫分離,實現數據庫的主從庫設計。
隨著系統在設計上的邏輯越來越復雜,使用的技術也會越來越多。對于后期的維護成本也會增加。一個好的系統,除了在滿足需求的功能上,還需要比較好的代碼質量。好的代碼的編程會減少系統出問題的幾率。另外在框架的選型上也是比較重要的。不同的框架能夠實現不同需求的功能。但是在最初選型上有前瞻性,對于后期系統的維護成本也會減低。因此設計一個針對不同用戶量的系統,需要考慮的因素是多方面的。并且隨著技術在不斷的更新,可以選擇的選擇項就比較多。目前的springboot框架,springcloud技術,微服務等等。應用開發的前后端分離技術等等,讓開發變得越來越簡單。微服務的使用也讓系統功能可以部署在不同的服務器上。一個功能的開發部署不會影響其他功能的使用。這樣對于大型系統的維護會簡單些。包括前端技術,從之前的html、css、js技術發展到jquery框架。到目前前端比較流行的vue.js框架。以及還可以做后端開發的node.js的前端技術。這些新框架技術的出現會使程序應用的開發變得容易。因此未來的系統設計也會在不停的變化中。
參考文獻:
[1] 李智慧.大型網站技術架構[M].電子工業出版社.2013.
[2] 唐文.海量運維、運營規劃之道[M].電子工業出版社.2014.