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

前言

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

簡單的網站

因爲我沒有作過php,那麼就以jsp爲例,jsp作網站前端,以電子商務網站爲例,描述一個簡單的網站架構php

前端 jsp+css+jscss

後端 java sshhtml

Web容器 tomcat前端

數據庫 mysqljava

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

部署方案爲:jquery

一臺服務器,部署tomcat和mysql程序員

架構圖以下:web

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不須要從新構建和部署,達到最大限度的解耦合,就是說修改系統的部分功能,其餘模塊能夠不受影響,或者受較小影響,並且影響範圍是能夠控制的。

 

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

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

相關文章
相關標籤/搜索