高并發(fā)交易型建站網(wǎng)站設(shè)計(jì)四原則
問(wèn)題四:對(duì)于未來(lái)的12306,有網(wǎng)友建議可以采用NOSQL,你是如何看待的?
葉萌:做一個(gè)大型高并發(fā)的交易型網(wǎng)站不可能從一個(gè)技術(shù)點(diǎn)就能突破,它需要綜合性的考慮,包括前端、后端,后端又包括業(yè)務(wù)邏輯和數(shù)據(jù)處理,都需要考慮到。業(yè)務(wù)邏輯需要特別強(qiáng)調(diào),做任何網(wǎng)站最重要的一點(diǎn)就是它的業(yè)務(wù)邏輯本身以及這個(gè)業(yè)務(wù)邏輯的優(yōu)化上。
但是,據(jù)我知道,沒(méi)有人用NOSQL的技術(shù)做交易系統(tǒng)。因?yàn)閿?shù)據(jù)一致性對(duì)交易系統(tǒng)是第一位的需求,買(mǎi)到了就是買(mǎi)到了,買(mǎi)不到就是買(mǎi)不到,不能說(shuō)在這一刻既可以買(mǎi)到又可以不買(mǎi)到,這個(gè)是大家不能接受的。所以對(duì)于交易型的系統(tǒng)用NOSQL技術(shù)來(lái)提高性能是有問(wèn)題。
2012年春節(jié),鐵道部推出12306網(wǎng)站,進(jìn)行網(wǎng)絡(luò)實(shí)名購(gòu)票。每一個(gè)返鄉(xiāng)人原以為能買(mǎi)著一張回家的火車(chē)票,但結(jié)果還是大失所望。7天內(nèi),12306網(wǎng)站訪問(wèn)用戶(hù)已占全球互聯(lián)網(wǎng)用戶(hù)的0.902%,每天點(diǎn)擊量高達(dá)10億人次;系統(tǒng)一度支撐不住如此龐大的訪問(wèn)量而陷入崩潰。針對(duì)12306的責(zé)難也不絕于耳。
首先講前端,在做真正交易部分的前端的界面,要設(shè)計(jì)的盡可能地簡(jiǎn)單和輕。做這些頁(yè)面不是為了炫而是為了做事,頁(yè)面要非常簡(jiǎn)潔,簡(jiǎn)潔反映在數(shù)據(jù)量盡可能少,同時(shí)最好都在一個(gè)http連接或者很少在http連接就能把這個(gè)頁(yè)面下載過(guò)來(lái)或者上傳回去。
后端的還有一塊——數(shù)據(jù)處理方面。這個(gè)跟訂票有關(guān)系,訂票以后需要做一個(gè)事務(wù),就是要從下單到完成訂票是一個(gè)完整的事務(wù),這個(gè)事務(wù)和電商下單的時(shí)候有一定的相似性,直到付款這一步之前都跟電商就很像。這個(gè)部分的問(wèn)題在哪里?12306采取的一個(gè)做法就是同步的響應(yīng),同步做法是大家比較喜歡的一種做法,就是下了單馬上能看到買(mǎi)到票沒(méi)有。但是同步的做法對(duì)系統(tǒng)的挑戰(zhàn)比較高,有很多電商的網(wǎng)站實(shí)際已經(jīng)從業(yè)務(wù)邏輯的調(diào)整為一個(gè)異步,就是把訂票這個(gè)事務(wù)變成異步操作來(lái)完成。
我們稍微總結(jié)一下,大型的網(wǎng)站設(shè)計(jì)主要是要注意四個(gè)方面:第一,前端要盡量輕;第二,有一些靜態(tài)的或者變化不怎么頻繁的數(shù)據(jù)盡可能地使用緩存機(jī)制。包括像CDN、自己做的緩存等;第三,盡可能地把同步的交易異步化。第四,數(shù)據(jù)要盡可能劃分開(kāi),系統(tǒng)的設(shè)計(jì)從功能上要盡可能地劃分開(kāi),從數(shù)據(jù)上不關(guān)聯(lián)的數(shù)據(jù)或者弱相關(guān)的數(shù)據(jù)盡可能分開(kāi),甚至強(qiáng)相關(guān)的數(shù)據(jù)也需要想一定的方法把它們分開(kāi),變成弱相關(guān)的數(shù)據(jù),因?yàn)檫@樣可以最好地做橫向擴(kuò)展,做并發(fā)處理。
問(wèn)題三:基于上述問(wèn)題,如何設(shè)計(jì)一個(gè)高并發(fā)的交易型網(wǎng)站?需要從哪些方面考慮?關(guān)系型數(shù)據(jù)庫(kù)最大的問(wèn)題就是對(duì)這個(gè)數(shù)據(jù)一致性的保障最好,因?yàn)樗С忠恍┰硬僮鳌⑹聞?wù)處理這些東西,所以它對(duì)一致性處理是最好的?;ヂ?lián)網(wǎng)上大量的數(shù)據(jù)對(duì)一致性的需求沒(méi)有交易系統(tǒng)這么高,所以NOSQL的技術(shù)主要是在放松了對(duì)數(shù)據(jù)一致性要求的前提下發(fā)展起來(lái)的一種數(shù)據(jù)處理技術(shù)。所以NOSQL的一個(gè)特點(diǎn),它放松了對(duì)數(shù)據(jù)一致性的需求,獲得了性能的提升和吞吐量的提升。
對(duì)此,中國(guó)鐵路客戶(hù)服務(wù)中心透露,企業(yè)網(wǎng)站建設(shè),目前,鐵道部已啟動(dòng)了新一代客票系統(tǒng)的規(guī)劃和設(shè)計(jì)??紤]采用網(wǎng)站系統(tǒng)的設(shè)計(jì)存在的問(wèn)題分析?
這個(gè)比電商要復(fù)雜,因?yàn)樗龅氖乱芏?,?jì)算就比較多,或者要做好幾個(gè)查詢(xún),才能把信息匯總起來(lái)。如果涉及到關(guān)聯(lián)訂票的情況就更復(fù)雜了,但是目前12306還沒(méi)有實(shí)現(xiàn)關(guān)聯(lián)訂票。
#p#分頁(yè)標(biāo)題#e#還有一招就是盡可能地把同步操作變成異步操作。所謂異步操作就是它不需要馬上給你回復(fù)。舉一個(gè)例子,大家都用過(guò)攜程網(wǎng),攜程網(wǎng)訂飛機(jī)票,大家知道在攜程里選了以后就下單了,下單以后攜程不會(huì)馬上告訴你訂票成功的,它會(huì)告訴你它會(huì)去處理,會(huì)把處理的結(jié)果給你,通過(guò)短信通知你。這樣的流程帶來(lái)什么好處?可以把收集訂單,收集完以后用類(lèi)似于批處理的方式,集中處理這些訂單。在業(yè)務(wù)邏輯和業(yè)務(wù)流程上做一些調(diào)整,對(duì)大型網(wǎng)站的橫向擴(kuò)展是非常有好處。
第一招就是盡可能做劃分。所謂劃分就是有功能上的劃分和數(shù)據(jù)上的劃分。第一,查詢(xún)的和交易等功能盡可能地劃分,由不同的服務(wù)器來(lái)做相關(guān)的事情。第二,從數(shù)據(jù)上劃分,如果是一個(gè)數(shù)據(jù)庫(kù),盡可能地要把一張很復(fù)雜的大表分給各種小表,尤其不相關(guān)的信息,盡可能拆分到不同的表里甚至不同的數(shù)據(jù)庫(kù)里。舉一個(gè)例子,像淘寶很簡(jiǎn)單的一個(gè)劃分方法就是以網(wǎng)店為單位設(shè)計(jì)這個(gè)表,一個(gè)極端的例子就是每個(gè)網(wǎng)店是一張表,當(dāng)然這個(gè)例子很極端,它肯定不是這么做的,一個(gè)網(wǎng)店一張表的話,表的數(shù)量肯定太多了。我查了一些資料,在春運(yùn)的時(shí)間根據(jù)鐵道部發(fā)布的全國(guó)列車(chē)運(yùn)行圖,在2012年春運(yùn)期間好象開(kāi)了2064對(duì)列車(chē),來(lái)往算一對(duì)的話,總共開(kāi)了2064對(duì)。如果把一對(duì)看成一個(gè)網(wǎng)店話,論壇門(mén)戶(hù)網(wǎng)站建設(shè),就是開(kāi)了2064個(gè)網(wǎng)店,每一個(gè)網(wǎng)店里面每一條鐵路線,實(shí)際就是任何每?jī)牲c(diǎn)都應(yīng)該可以買(mǎi)到票,理論上講可以買(mǎi)到票,如果一條線上N個(gè)節(jié)點(diǎn),應(yīng)該是(28:09ncr)都可以買(mǎi)到票。這么一個(gè)組合,這個(gè)數(shù)字出來(lái)相當(dāng)于網(wǎng)店里的商品數(shù)。這個(gè)量也不算太大,如果以每一對(duì)列車(chē)作為一個(gè)處理單元,可以把(28:37)分開(kāi)的。
從業(yè)務(wù)邏輯角度來(lái)講,火車(chē)票的查詢(xún)從A地到B地有多少趟車(chē),這個(gè)查詢(xún)的邏輯比電商的要復(fù)雜。電商無(wú)非是到一個(gè)庫(kù)里看還有沒(méi)有貨,結(jié)果要么就是有要么就是沒(méi)有,不會(huì)有第三種。但是對(duì)于火車(chē)票來(lái)講,從A地到B地可能有多種選擇,可能有幾趟車(chē)可以選擇。
但是NOSQL的技術(shù)在類(lèi)似12306的這種網(wǎng)站里不是不能用,它可以在做狀態(tài)查詢(xún)的時(shí)候用到,論壇門(mén)戶(hù)網(wǎng)站建設(shè),比如查有票沒(méi)票,這時(shí)候數(shù)據(jù)一致性的需求沒(méi)有那么高。
從后端業(yè)務(wù)邏輯上來(lái)講,業(yè)務(wù)邏輯剛才講了業(yè)務(wù)流程優(yōu)化的一個(gè)問(wèn)題,做這種大型的網(wǎng)站要多做橫向擴(kuò)展,就是大家說(shuō)的scale-out。策略就幾招:
事務(wù)的處理有一個(gè)最大的挑戰(zhàn)是數(shù)據(jù)一致性的問(wèn)題,就是一定要保證后端在任何一個(gè)時(shí)間點(diǎn)它是一致的,伸縮性不管是縱向擴(kuò)展還是橫向擴(kuò)展,尤其是橫向擴(kuò)展比較難的地方就在于數(shù)據(jù)的一致性的問(wèn)題。
葉萌:不管是京東也好,淘寶也好,還是12306也好,都可以歸結(jié)為一種在線交易系統(tǒng)。這種系統(tǒng)大致地可以分前端和后端兩大部分。后端再細(xì)分一點(diǎn),可以分業(yè)務(wù)邏輯的部分和數(shù)據(jù)處理的部分。
后端可以分成兩塊:一個(gè)是業(yè)務(wù)邏輯,一個(gè)是數(shù)據(jù)處理。
前端的設(shè)計(jì)要在滿(mǎn)足功能需求的前提之下做得比較輕,所謂輕就包括前端的格式和數(shù)據(jù)量,每下載一個(gè)頁(yè)面所需要的數(shù)據(jù)量以及打開(kāi)同一個(gè)頁(yè)面上建立的http的連接數(shù)要盡可能地少。反之,如果網(wǎng)頁(yè)比較重的話,每下載一個(gè)網(wǎng)頁(yè)從服務(wù)器傳出來(lái)的東西就會(huì)比較多,當(dāng)訪問(wèn)量很大時(shí),對(duì)系統(tǒng)的帶寬會(huì)有極大的挑戰(zhàn)。
從這個(gè)特點(diǎn)來(lái)看,要不要用這個(gè)NOSQL的技術(shù),跟我們?cè)谧鍪裁礃拥氖虑榉浅S嘘P(guān)系。如果這些數(shù)據(jù)用來(lái)做一些分析等等,那用NOSQL技術(shù)固然很好,因?yàn)樽鲞@些東西首先它通常是線下做,而且前一秒和后一秒鐘數(shù)據(jù)有一定的誤差不會(huì)對(duì)你的統(tǒng)計(jì)結(jié)果產(chǎn)生很明確的干擾。
葉萌:首先要搞清楚NOSQL是怎么來(lái)源的, NOSQL技術(shù)出現(xiàn)最主要的原因,就是隨著互聯(lián)網(wǎng)模式的發(fā)展,數(shù)據(jù)量日漸增大,這些數(shù)據(jù)量用數(shù)據(jù)庫(kù)尤其是關(guān)系型數(shù)據(jù)庫(kù)處理不過(guò)來(lái),這是NOSQL發(fā)展的背景。
在這里我想補(bǔ)充一點(diǎn):多瀏覽器的兼容性問(wèn)題。12306目前好象使只能使用IE瀏覽器,用google的Chrome的瀏覽就不能并發(fā)的用,所以這也是一個(gè)需要注意的問(wèn)題。
12306前端設(shè)計(jì)比較重,主要表現(xiàn)幾個(gè)方面:第一,把CSS的表和網(wǎng)頁(yè)混在一塊下載。第二,打開(kāi)一個(gè)網(wǎng)頁(yè)需要建立的http連接數(shù)都很多。很多關(guān)鍵的網(wǎng)頁(yè)包括訂票的網(wǎng)頁(yè)、查詢(xún)的網(wǎng)頁(yè),打開(kāi)一個(gè)網(wǎng)頁(yè)需要建立的http連接數(shù)都很多,有人分析過(guò)打開(kāi)一個(gè)網(wǎng)頁(yè)超過(guò)70個(gè)http連接數(shù)。每一臺(tái)服務(wù)器建立的http連接數(shù)是有一個(gè)上限,如果大家都去并發(fā)訪問(wèn)的時(shí)候,服務(wù)器的連接數(shù)很快就不夠用了。