大型網站系統架構實踐(一)從簡單到復雜


前言

寫這篇文章的目的是想用來幫助自己思考和理清頭緒,以及如何從一個簡單的網站架構演進發展成一個大型網站架構,主要側重在技術方面

簡單的網站

由於我沒有做過php,那么就以jsp為例,jsp做網站前端,以電子商務網站為例,描述一個簡單的網站架構

前端 jsp+css+js

后端 java ssh

Web容器 tomcat

數據庫 mysql

開發人員,美工1個,前端一個,java一個

部署方案為:

一台服務器,部署tomcat和mysql

架構圖如下:

image

應用和數據庫分布式部署

那么網站運行一段時間,開始盈利了,用戶也增多了,這時候數據庫的數據量還不是很大

但是越來越多的用戶訪問,會占用大量的服務器內存和cpu,應該要將數據庫和應用分開部署,架構圖如下

image

這樣網站還能運營一段時間

解耦合開發

那么我們再來看看開發方面的問題,但是開發和運維往往是分不開的,由於網站業務發展較快,我們肯定要在上面添加新的功能,否則沒法玩了,功能也越來越多,開發人員 也變多了,互相之間依賴也變多了,以前的開發模式是,java程序員從jsp一直寫到dao,全部包攬,那么現在有5個java一起開發了,各負責不同的功能,如用戶模塊,商品模塊,訂單模塊,交易模塊等,那么問題就來了

1 java程序員經常干些調css,和寫大量javascript的活,我們用的是jquery

2 並不是每次都要等到所有模塊都完成開發了才上線,很多時候只需要一個模塊完成修改,就可以上線了,然后代碼都寫在一個項目里面,版本控制變得相當困難,而且每次修改一個模塊的功能,可能影響到另一個模塊的功能,導致項目變的非常不穩定,正在運營中的項目,出現這種情況將是致命的,無限的加班加點也於事無補,痛苦啊。

解決方案1(模塊化)

這是多年前我想到的一個方案,這么多功能不能混亂的放在一個project里面,這里我指的是java web項目,至少要在開發的時候模塊化,將不同的功能獨立出去,模塊之間通過接口調用,比如分為用戶模塊,應用模塊,商品模塊,訂單模塊,交易模塊等,不同的人負責開發,那么模塊之間怎么進行通信呢,我當時的方案是,每個后端模塊都是一個jar包項目,發布的時候打成jar包給其他模塊調用,項目通過maven進行構建,這樣開發到部署就比較自動化,基本實現模塊化開發了,項目發布也變得穩定多了。

 

用maven做模塊化的缺點

這個思想是從spring那里得來的,他們也是將不同功能進行模塊化,然后這種形式卻有很多的缺點:

1 隨着時間的推移,各個模塊都在不停的更新,版本一直在升級,假如模塊A依賴模塊B,C

可以理解為A是web前置模塊,B是用戶模塊,C是訂單模塊

如下圖:

clip_image001

如果B或者C變更了,那么A有2種選擇:

1 不更新B和C,仍然可以用,帶來的后果將是得不到最新的b和c的功能支持

2 如果選擇更新,A需要重新加入新的B或者C的jar包並進行調試和測試工作,

從接口依賴來看

由於B和C需要查數據庫,因此B和C的jar包暴露了過多的api給A,且沒辦法很好的控制,對於項目A的開發者來說,接口不明確,幾乎所有public的方法都可以調用,這樣B和C的變更對上層的A來說,造成的影響是不可控的。

從系統性能來看

由於B和C都是要查數據庫的,那么以jar的形式在A中,占用A項目所有服務器的內存和cpu等資源,無法分布式部署。

解決方案2:模塊化並分布式部署

那么應該用什么方案呢,最好是分布式部署,A與B,C通過網絡通信進行調用

這樣帶來的好處

1 A,B,C實現分布式部署

2 B,C提供明確的接口給A調用,只要接口不變,B和C修改內部業務邏輯,A不需要重新構建和部署,達到最大限度的解耦合,就是說修改系統的部分功能,其他模塊可以不受影響,或者受較小影響,而且影響范圍是可以控制的。

 

下一篇  大型網站系統架構的演進(二)分布式模塊之間的通信

目錄 大型網站系統架構的演進目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM