對 Workflow 架構(gòu)改進(jìn)的猜想
------ Jack 2008
開發(fā) workflow 已經(jīng)是兩年前的事了,那是我第一家公司的第一個(gè)有形產(chǎn)品,也是我主導(dǎo)開發(fā)的。在這里,真的要感謝以前的主管,使我從一個(gè)程序員爬到了技術(shù)主導(dǎo)的位置。
workflow 的項(xiàng)目背景是這樣的:公司是個(gè)集團(tuán)公司,主產(chǎn)業(yè)是制造和電子,開發(fā)人員有幾百號,我們屬于第二個(gè)事業(yè)部,用這個(gè)系統(tǒng)的有管理層,業(yè)務(wù)層大約上萬人,每個(gè)月的數(shù)據(jù)量為 200多萬筆,這個(gè)產(chǎn)品只是內(nèi)銷。就是在這樣的背景下公司組了 20 個(gè)人的團(tuán)隊(duì),在兩年的時(shí)間開發(fā)了 workflow 系統(tǒng), 它的開發(fā)語言是 Java, 總體架構(gòu)是 Struts+Hibernate+Spring, 有 J2EE 的部分,也有 J2SE 的部分,采用的標(biāo)準(zhǔn)是 WMfC.
當(dāng)時(shí)數(shù)據(jù)庫只有一個(gè)(Oracle 數(shù)據(jù)庫),在單獨(dú)的服務(wù)器上,配置很高,Web 服務(wù)器也是單獨(dú)的高檔機(jī),還有就是客戶端的 Application. 典型的三層架構(gòu)。這樣的系統(tǒng)能夠有多大的吞吐量呢,性能如何能,可想而知。系統(tǒng)的性能沒有禁得住應(yīng)用的考驗(yàn),于是我們反思了,從新考慮了系統(tǒng)架構(gòu)。發(fā)現(xiàn)瓶頸在數(shù)據(jù)庫,不過那時(shí)我就離職了,在公司整整呆了 2年零6個(gè)月。
事隔這么久,只有猜想當(dāng)時(shí)該如何如何。猜想 workflow 已經(jīng)超負(fù)荷工作了,數(shù)據(jù)庫占了大量 CPU 資源, 系統(tǒng)沒有擴(kuò)展性!猜想 workflow 以服務(wù)的方式加入了互聯(lián)網(wǎng),用戶超過 1 個(gè)億。
從下面兩方面改進(jìn)系統(tǒng)。
1. 數(shù)據(jù)庫層的架構(gòu)改進(jìn):
l 第一個(gè)觀念就是數(shù)據(jù)的讀寫分開,比如用完全一樣的數(shù)據(jù)庫,一個(gè)主數(shù)據(jù)庫用來寫,其他從數(shù)據(jù)庫用來完成讀操作,隔段時(shí)間將寫數(shù)據(jù)庫同步更新到從數(shù)據(jù)庫中。
l 用戶表是個(gè)大表,超過一個(gè)億的資料,檢索更新速度很慢。于是把用戶表單獨(dú)放在一個(gè)數(shù)據(jù)庫服務(wù)器中,并且按照用戶的所在省份水平分割成多個(gè)表,每個(gè)表就有 300 多萬的數(shù)據(jù),查詢可控制在 1 秒之內(nèi)。
l 表單流量很大,每月上千萬筆。同樣,表單表按照功能分割到多個(gè)數(shù)據(jù)庫服務(wù)器中,每個(gè)數(shù)據(jù)庫中再按照表單類別水平分割。這樣在增加表單時(shí),可達(dá)到服務(wù)器的線性擴(kuò)展。
l Oracle 在分布式方面做得很好,可以充分利用這個(gè)優(yōu)勢。
l 數(shù)據(jù)庫的緩存
2. 應(yīng)用層的架構(gòu)改進(jìn):
l 盡量做到動(dòng)態(tài)網(wǎng)頁靜態(tài)化,比如在流程中跑的一個(gè)固化的表單不應(yīng)該動(dòng)態(tài)生成,而應(yīng)該在提交表單時(shí)就做靜態(tài)化。
l 使用緩存。有些網(wǎng)頁,像首頁,可以學(xué)習(xí)百度首頁,緩存24小時(shí)。
l 做鏡像服務(wù)器
l 使用負(fù)載均衡技術(shù),比如 DNS負(fù)載均衡,四層交換機(jī)負(fù)載技術(shù)等等很多現(xiàn)成的方案可遵循。
l 對系統(tǒng)局部模塊優(yōu)化。不要自己設(shè)計(jì)模式,現(xiàn)有的模式很多,可以參考。
l 引入中間件技術(shù),對源有系統(tǒng) SOA 的觀念做集成和整合。比如整合 ERP, EIP,EPP等系統(tǒng)到 workflow中。
本人在系統(tǒng)架構(gòu)方面經(jīng)驗(yàn)比較少,在系統(tǒng)分析方面做得工作比較多,請 blog 朋友多多指教
本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請注明出處,如有版權(quán)問題請及時(shí)通知。由于博客時(shí)間倉促,錯(cuò)誤之處敬請諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。