本次介紹的項(xiàng)目是自己學(xué)習(xí)整理出來的,可能對(duì)于開源界來說只是一個(gè)小舟,不過還是希望能寫好這個(gè)項(xiàng)目的wiki,面向小白或初級(jí)開發(fā)者,讓大家了解并親自打造自己的電商后臺(tái)系統(tǒng)。
對(duì),本項(xiàng)目已經(jīng)開源,不過還是希望各位大大能認(rèn)真看完本系列后,再去下載源碼,在本系列最后一章會(huì)給出開源地址,謝謝。
大家都知道,一個(gè)真實(shí)的企業(yè)級(jí)項(xiàng)目開發(fā)過程、大型企業(yè)項(xiàng)目開發(fā)的編碼思維、經(jīng)驗(yàn)、技巧、高質(zhì)量的線上作品都是需要耗費(fèi)人力物力和成本,同樣我們的項(xiàng)目也需要你擠出時(shí)間慢慢消化哦!
讓我們來看看我們最熟悉的淘寶架構(gòu)
當(dāng)然,沒有哪個(gè)網(wǎng)站平臺(tái)搭建一開始就是這么豐富的,都是一步一步進(jìn)展起來的。
我們本次也要從核心模塊-演進(jìn)細(xì)節(jié)到核心架構(gòu)-設(shè)計(jì)思想,最后實(shí)現(xiàn)高性能、高并發(fā)、高可用的電商實(shí)戰(zhàn)項(xiàng)目。
本次我們將講的有數(shù)據(jù)庫(kù)及接口、項(xiàng)目初始化、用戶模塊、分類模塊、商品模塊、購(gòu)物車模塊、收貨地址模塊、支付模塊、訂單模塊······
由于是序章,我們先來了解一下,一個(gè)大型Java項(xiàng)目架構(gòu)演進(jìn)解析。
首先從一個(gè)小網(wǎng)站說起,一臺(tái)服務(wù)器就夠了,數(shù)據(jù)庫(kù)與應(yīng)用均部署到一個(gè)服務(wù)器上。
隨著用戶增加,數(shù)據(jù)量增大,硬盤支撐不起,這時(shí)一臺(tái)服務(wù)器已經(jīng)支持不起了。我們可以將應(yīng)用服務(wù)器和數(shù)據(jù)服務(wù)分離,給應(yīng)用服務(wù)器配置更好的CPU、內(nèi)存等,給數(shù)據(jù)服務(wù)器配置更好更快的硬盤,如下圖用了三臺(tái)服務(wù)器以提高性能。
即使文件服務(wù)器宕機(jī),該架構(gòu)依然可以支持使用,隨著訪問的并發(fā)增高,為了降低接口訪問時(shí)間、提高服務(wù)性能,我們需要繼續(xù)優(yōu)化演進(jìn),我們會(huì)發(fā)現(xiàn)有很多數(shù)據(jù)其實(shí)并不需要每次都從數(shù)據(jù)庫(kù)中讀取,于是我們?cè)黾恿司彺妫饕?0%的訪問都集中在20%的數(shù)據(jù)上(28原則),只要緩存得當(dāng),系統(tǒng)的性能也將得到提升,而緩存又分為兩種Local Cache本地緩存、Remote Distributed Cache遠(yuǎn)程單機(jī)緩存(遠(yuǎn)程分布式緩存)下圖為分布式緩存集群(什么樣的業(yè)務(wù)使用遠(yuǎn)程緩存、什么業(yè)務(wù)使用本地緩存)
這個(gè)時(shí)候隨著訪問的QPS不斷提高,服務(wù)器的處理能力有限,例如Tomcat,則其將成為一個(gè)瓶頸,即使購(gòu)買更好的硬件,但總是存在上限且成本也不低,這時(shí)我們就需要做個(gè)服務(wù)器的集群(負(fù)載均衡調(diào)度服務(wù)器),這樣我們就可以橫向擴(kuò)展我們的服務(wù)器,解決服務(wù)器處理能力的瓶頸。
這時(shí)我們還要思考幾個(gè)問題,所謂負(fù)載均衡的調(diào)度策略是什么,適合什么場(chǎng)景,當(dāng)我們登錄A服務(wù)器,Session信息存儲(chǔ)在A服務(wù)器上,假設(shè)我們的(IPHash)負(fù)載均衡將其信息分散到其他服務(wù)器,但是其不夠分散也不夠均勻,可能造成某些服務(wù)器壓力過大,某些則沒有壓力,這時(shí)機(jī)器網(wǎng)卡的帶寬就可能成為瓶頸,這時(shí)我們使用輪詢或最小連接負(fù)載的策略,可能導(dǎo)致訪問A服務(wù)器后,再訪問B服務(wù)器時(shí)讀取不到Session信息,這時(shí)我們就要解決Session管理的問題,我們使用Session Sticky(粘制會(huì)話)來處理這個(gè)問題。
就比如說每次吃飯都為了保證用的是我們自己的碗筷,只要在飯店中存了我們的碗筷,則每次去這家飯店吃就好了,其處理方式:對(duì)于同一連接中的數(shù)據(jù)包,負(fù)載均衡將其進(jìn)行一個(gè)NAT轉(zhuǎn)換后轉(zhuǎn)發(fā)至后端固定的服務(wù)器進(jìn)行處理,如下圖所示,這種方案解決了session共享問題(缺點(diǎn):服務(wù)器一旦重啟其session將全部消失、負(fù)載均衡服務(wù)器成為一個(gè)有狀態(tài)的服務(wù)器,比較難實(shí)現(xiàn)容災(zāi))
我們?cè)倏纯吹诙€(gè)解決方案,兩個(gè)服務(wù)器通過復(fù)制都保存Browser1的session信息(缺點(diǎn):應(yīng)用服務(wù)器間的帶寬問題,服務(wù)器間要不斷的同步session信息、大量用戶在線時(shí)服務(wù)器占用內(nèi)存過多、不適合做大規(guī)模集群)
再看看第三個(gè)方案,基于cookie,即每次吃飯都帶上自己的碗筷,則去哪家飯店都可以吃飯,用攜帶session信息的cookie去訪問服務(wù)器,其也解決了session共享的問題(缺點(diǎn):cookie長(zhǎng)度有限,且保存在瀏覽器上,安全性沒有保障)
接著再看看第四種解決方案,我們將session做成一個(gè)session服務(wù)器,browser1通過負(fù)載均衡請(qǐng)求服務(wù)器,服務(wù)器將session信息存儲(chǔ)到session服務(wù)器中,當(dāng)想要獲取時(shí)就反向進(jìn)行。(缺點(diǎn):目前session Server是單點(diǎn)的,如何解決單點(diǎn),保證可用性)
我們可以將Session Server也做成集群,其適合用于Session數(shù)量與web服務(wù)數(shù)量大的情況下,更改架構(gòu)后,也要修改應(yīng)用存儲(chǔ)session的業(yè)務(wù)邏輯。 接下來我們?cè)倏纯磾?shù)據(jù)庫(kù),讀寫都要經(jīng)過數(shù)據(jù)庫(kù),當(dāng)用戶量達(dá)到一定量時(shí),數(shù)據(jù)庫(kù)又將成為一個(gè)瓶頸,則我們將如何解決?
我們可以使用數(shù)據(jù)庫(kù)的讀寫分離,主從庫(kù),并通過統(tǒng)一的數(shù)據(jù)訪問模型進(jìn)行訪問,將所有讀操作引入到Slave服務(wù)器,將寫操作引入到主庫(kù)當(dāng)中,由于數(shù)據(jù)庫(kù)讀寫分離,所以應(yīng)用程序也要有相應(yīng)的變化,使用數(shù)據(jù)訪問模塊讓應(yīng)用程序開發(fā)人員不用理會(huì)讀寫分離的存在,這樣多數(shù)據(jù)源讀寫代碼對(duì)我們的業(yè)務(wù)就沒有了侵入(代碼層的演變,如何支持多數(shù)據(jù)源、如何封裝對(duì)業(yè)務(wù)沒有侵入、如何使用現(xiàn)用的ORM框架實(shí)現(xiàn)數(shù)據(jù)讀寫分離、是否更換ORM、其優(yōu)缺點(diǎn)?)
當(dāng)我們?cè)L問過大,I/O過大,我們數(shù)據(jù)的讀寫分離又將遇到這幾個(gè)問題,主從庫(kù)復(fù)制時(shí)是否延遲(分機(jī)房部署、跨機(jī)房傳輸),應(yīng)用對(duì)于數(shù)據(jù)源的路由問題,接著我們?yōu)榱颂岣叻?wù)器,增加了CND和反向代理服務(wù)器,使用CDN可以解決不同地方訪問速度問題、反向代理可以在機(jī)房中緩存用戶的資源。
這時(shí)文件服務(wù)器又出現(xiàn)了瓶頸,我們將文件服務(wù)器改為分布式文件服務(wù)器集群,我們要考慮到:如何不影響線上的業(yè)務(wù)訪問,是否需要業(yè)務(wù)部門幫忙清理數(shù)據(jù),是否需要備份服務(wù)器,是否需要重新做域名解析。
這時(shí)我們的數(shù)據(jù)庫(kù)又出現(xiàn)了新的瓶頸,我們選擇專庫(kù)專用的方式,進(jìn)行數(shù)據(jù)庫(kù)的垂直拆分,可以解決寫數(shù)據(jù)、并發(fā)、量大的問題,分庫(kù)后又將帶來一些新的問題:跨業(yè)務(wù)的事務(wù)(分布式事務(wù))
當(dāng)某個(gè)數(shù)據(jù)的訪問量、數(shù)據(jù)量、日志等過大達(dá)到瓶頸時(shí),這時(shí)我們就要進(jìn)行數(shù)據(jù)庫(kù)的水平拆分,我們將User拆分成Users1和Users2,水平拆分即將同一個(gè)數(shù)據(jù)表的數(shù)據(jù)拆分到兩個(gè)數(shù)據(jù)庫(kù)當(dāng)中,這時(shí)我們就解決了單數(shù)據(jù)庫(kù)的瓶頸。
水平拆分后,SQL路由出現(xiàn)一些問題,假設(shè)我們想知道某個(gè)用戶是存在Users1還是Users2中,且由于分庫(kù),主鍵的策略也將有所不同,同時(shí)也將面臨一個(gè)分頁的問題(后臺(tái)管理系統(tǒng)在進(jìn)行展示時(shí)還要考慮分頁的問題),當(dāng)完成后,我們又發(fā)現(xiàn)應(yīng)用服務(wù)器的搜索量上升,這時(shí)我們將應(yīng)用服務(wù)器的搜索功能提取出來做成搜索引擎,同時(shí)部分場(chǎng)景使用NoSQL提高性能。
當(dāng)然以上架構(gòu)還存在部分問題,如負(fù)載均衡服務(wù)器是單點(diǎn),因此也可以將負(fù)載均衡服務(wù)器做成集群,進(jìn)行主從的熱備,同時(shí)做一個(gè)自動(dòng)切換的解決方案。
過程中:安全性、數(shù)據(jù)分析、監(jiān)控、反作弊… 繼續(xù)發(fā)展:SOA架構(gòu)、服務(wù)化、消息隊(duì)列、任務(wù)調(diào)度、多機(jī)房…
因此任何一個(gè)高大上的項(xiàng)目技術(shù)架構(gòu)和開發(fā)技術(shù)實(shí)現(xiàn)不是一蹴而就的。
文章來源:51CTO,作者:AwakeningCode;
編者:云朵匠 | 數(shù)商云(微信ID:shushangyun_com)
【數(shù)商云www.zhimaihui.cn】致力于提供企業(yè)級(jí)的電子商務(wù)平臺(tái)建設(shè)服務(wù),長(zhǎng)期為大中型企業(yè)打造數(shù)據(jù)化、商業(yè)化、智能化的電子商務(wù)建設(shè)方案,同時(shí)我們還提供B2B電子商務(wù)平臺(tái)、B2B2C多用戶商城系統(tǒng)、B2C電子商務(wù)系統(tǒng)、跨境進(jìn)口電商平臺(tái)、供應(yīng)商管理系統(tǒng)、新零售電商平臺(tái)、直播電商系統(tǒng)等一系列系統(tǒng)定制開發(fā)服務(wù)。
評(píng)論