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