對(duì)一個(gè)“失敗”項(xiàng)目的審視--分析
洋洋灑灑寫(xiě)了好多字啊,我都沒(méi)想到我能寫(xiě)這么多字來(lái)。看了上面的架構(gòu)一定有人會(huì)想“不對(duì)吧,你在***篇中可是寫(xiě)的是11種服務(wù)器啊,你數(shù)一數(shù)上面的架構(gòu)圖上才幾個(gè)?老兄啊,你別是為了點(diǎn)擊率而忽悠我們吧”。對(duì)于存有這種看法的看客,我只能說(shuō)“您看的可真細(xì)致啊!”上面的這個(gè)架構(gòu)圖的確和我***篇中寫(xiě)的11種服務(wù)器的架構(gòu)不同,那是因?yàn)樯厦娴膱D是目前的架構(gòu)圖,而11種服務(wù)器則是***版的產(chǎn)品架構(gòu)。大家可以來(lái)看看***版和目前版本架構(gòu)圖的區(qū)別。
后來(lái)將網(wǎng)關(guān)服務(wù)器和邏輯處理服務(wù)器合并;帳號(hào)服務(wù)器和認(rèn)證服務(wù)器合并;統(tǒng)計(jì)服務(wù)器、公告服務(wù)器、在線(xiàn)服務(wù)器砍掉;計(jì)費(fèi)服務(wù)器拆分成上報(bào)服務(wù)器和同步服務(wù)器。所以大家就看到了上一篇中的架構(gòu)圖。
看到上面的架構(gòu)圖以后不知道大家會(huì)有何感想,反正我聽(tīng)到領(lǐng)導(dǎo)好幾次用Perfect來(lái)形容。當(dāng)時(shí)自己也沾沾自喜了好久。
不過(guò)隨著項(xiàng)目的完成,以及性能測(cè)試和壓力測(cè)試的開(kāi)展,卻發(fā)現(xiàn)了一個(gè)非常大的問(wèn)題—性能低下。更有甚者當(dāng)網(wǎng)吧的一個(gè)結(jié)賬業(yè)務(wù)發(fā)送到上報(bào)服務(wù)器以后,上報(bào)服務(wù)器竟然需要2-3秒鐘才能處理完畢。這幾乎是災(zāi)難性的,要知道每個(gè)網(wǎng)吧我們的評(píng)估是每天上報(bào)2000條數(shù)據(jù),這樣一來(lái),一組服務(wù)器所能支持的網(wǎng)吧數(shù)量則少的可憐。同時(shí)處理速度過(guò)慢,會(huì)在業(yè)務(wù)上出現(xiàn)很大的漏洞。例如以連鎖網(wǎng)吧為例,用戶(hù)1在連鎖網(wǎng)吧中的A進(jìn)行消費(fèi)100塊錢(qián)以后,搶在連鎖網(wǎng)吧數(shù)據(jù)同步之前(由于處理速度太慢,而造成了延遲)又在連鎖網(wǎng)吧B中進(jìn)行消費(fèi),這樣以來(lái)相當(dāng)于用戶(hù)1進(jìn)行了重復(fù)性消費(fèi)。容易造成網(wǎng)吧賬目出現(xiàn)大量的負(fù)帳(用戶(hù)1消費(fèi)完后,不再進(jìn)行消費(fèi)),這對(duì)目前薄利的網(wǎng)吧行業(yè)的打擊無(wú)疑是巨大的。
究其原因,我覺(jué)得主要是因?yàn)槲覀冊(cè)谔幚硭袠I(yè)務(wù)的時(shí)候都是采取了先從SQL SERVER數(shù)據(jù)庫(kù)中查詢(xún)數(shù)據(jù),然后再進(jìn)行計(jì)算,并將SQL SERVER數(shù)據(jù)庫(kù)中的相關(guān)數(shù)據(jù)進(jìn)行修改的方式。要知道對(duì)于一個(gè)復(fù)雜的業(yè)務(wù),這種查詢(xún)是多次的。修改的內(nèi)容也會(huì)涉及到好幾張不同的表。
就拿網(wǎng)吧用戶(hù)表為例,一張表中會(huì)存放將近3000萬(wàn)條的數(shù)據(jù),即便是通過(guò)分庫(kù)分表的方式,雖然可以緩解,但也只能指標(biāo)不能治本。
第二個(gè)問(wèn)題是由于網(wǎng)吧數(shù)據(jù)是放在網(wǎng)吧服務(wù)器上,網(wǎng)吧每次交班時(shí)的交班金額是按照網(wǎng)吧本地?cái)?shù)據(jù)計(jì)算出來(lái)的。而網(wǎng)吧的每一條業(yè)務(wù)都上報(bào)給中心服務(wù)器,中心服務(wù)器會(huì)重新對(duì)數(shù)據(jù)計(jì)算一次;并且當(dāng)網(wǎng)吧服務(wù)器重啟的時(shí)候,對(duì)于網(wǎng)吧服務(wù)器和中心服務(wù)器上不一致的數(shù)據(jù)進(jìn)行強(qiáng)制更新。這個(gè)流程中出現(xiàn)了兩次計(jì)算,并且在不同的業(yè)務(wù)中以不同的計(jì)算結(jié)果作為依據(jù)(網(wǎng)吧中的交班和中心服務(wù)器中的強(qiáng)制數(shù)據(jù)更新)。這樣一來(lái)勢(shì)必會(huì)出現(xiàn)數(shù)據(jù)不正確的問(wèn)題(事實(shí)上,在產(chǎn)品剛上線(xiàn)不久的時(shí)候,我們的DBA都是在進(jìn)行數(shù)據(jù)的修正,即將中心服務(wù)器的數(shù)據(jù)修改成網(wǎng)吧的數(shù)據(jù))。
以上兩個(gè)問(wèn)題一直困擾著我很久,因?yàn)槿绻a(chǎn)品做成這樣的話(huà),在市場(chǎng)上就幾乎無(wú)法進(jìn)行推廣的。直到后來(lái)我離開(kāi)這家公司以后,才想到了使用NOSQL來(lái)實(shí)現(xiàn)。


























