龔磊 沈源淳
摘 要:隨著電子商務(wù)市場(chǎng)的蓬勃發(fā)展帶動(dòng)了傳統(tǒng)快遞業(yè)務(wù)量的急速上漲,由此劇增的業(yè)務(wù)數(shù)據(jù)傳輸、處理、查詢成為了快遞業(yè)提升服務(wù)品質(zhì)的新瓶頸。本文為解決大型信息處理系統(tǒng)中高性能、大吞吐量和高并發(fā)數(shù)據(jù)的優(yōu)化問(wèn)題,從軟件架構(gòu)、數(shù)據(jù)架構(gòu)、高可用三個(gè)方面闡述如何提高系統(tǒng)的整體性能,以保證大用戶量高并發(fā)訪問(wèn)系統(tǒng)時(shí)仍然具有良好的用戶體驗(yàn),以及高可用和高可靠性。
關(guān)鍵詞:高并發(fā);優(yōu)化設(shè)計(jì);大用戶量
引言
我國(guó)于2006發(fā)布的《物流術(shù)語(yǔ)》中給快遞定義是:承運(yùn)人將文件或貨物從發(fā)件人所在地通過(guò)承運(yùn)人自身或代理的網(wǎng)絡(luò)送達(dá)收件人手中的一種快速的運(yùn)輸服務(wù)方式[1]??爝f是突出物流服務(wù)中運(yùn)輸功能的一個(gè)特別版本,是針對(duì)物流中零散、快速、精確派送部分的一個(gè)具體體現(xiàn)。
快遞行業(yè)是一個(gè)既傳統(tǒng)又新興的行業(yè),說(shuō)起傳統(tǒng)其是典型的勞動(dòng)密集型行業(yè),跟大型工廠倉(cāng)庫(kù)有不少類(lèi)似,說(shuō)起新興是因其隨著互聯(lián)網(wǎng)購(gòu)物等新興需求使得市場(chǎng)不斷擴(kuò)大而蓬勃上升。其市場(chǎng)規(guī)模2008年僅0.13萬(wàn)億,據(jù)國(guó)家郵政局6月24日發(fā)布的《2016年度快遞市場(chǎng)監(jiān)管報(bào)告》顯示,2016年中國(guó)快遞業(yè)務(wù)量達(dá)到了312.8億,同比增長(zhǎng)51.4%[2]。電子商務(wù)市場(chǎng)的高速增長(zhǎng)產(chǎn)生了大量的快遞需求,尤其是C2C電商,對(duì)第三方快遞的依賴幾乎是 100%??爝f業(yè)務(wù)量的急劇增長(zhǎng)使得業(yè)務(wù)員要計(jì)劃和管理越來(lái)越多的數(shù)據(jù)[3-4]。業(yè)務(wù)快速增長(zhǎng),如果無(wú)法在短時(shí)間內(nèi)處理完成必然引起公司的運(yùn)營(yíng)效率降低,導(dǎo)致無(wú)法及時(shí)完成快遞業(yè)務(wù),又必然引起客戶的不滿,繼而影響自身信譽(yù)及后續(xù)業(yè)務(wù)[5]。
1業(yè)務(wù)場(chǎng)景分析
與電商圍繞用戶行為和商戶或商品維護(hù)不同,物流快遞系統(tǒng)里圍繞的基本就只有運(yùn)單。但是物流快遞有其特殊性,以及傳統(tǒng)行業(yè)難以避免的歷史遺留問(wèn)題,所以在一個(gè)運(yùn)單的生命周期內(nèi)有好幾個(gè)變體,簡(jiǎn)單說(shuō)來(lái)業(yè)務(wù)上是1收件(包括電商來(lái)的訂單可以看作是預(yù)備的運(yùn)單)、2發(fā)件(門(mén)店主要靠定期來(lái)回于門(mén)店與轉(zhuǎn)運(yùn)中心之間的班車(chē)來(lái)將收件以后的快遞件傳遞給上級(jí)門(mén)店、本區(qū)域的中心門(mén)店或最終達(dá)到本區(qū)域轉(zhuǎn)運(yùn)中心)、3到件(發(fā)件方區(qū)域轉(zhuǎn)運(yùn)中心發(fā)往收件人一方所在區(qū)域的轉(zhuǎn)運(yùn)中心乃至具體門(mén)店)、4派件(具體門(mén)店分配具體人員進(jìn)行快遞件的最終派送)、簽收(收件人簽收快遞件,最終完成整個(gè)生命周期)。其中每一處人員接手都有相關(guān)操作記錄,每一次涉及車(chē)輛的運(yùn)輸操作都會(huì)有每件快遞件的掃描記錄操作乃至將多個(gè)小件打包后的包裹記錄的掃描記錄操作。車(chē)輛相關(guān)操作可能大都集中在前后半夜的幾個(gè)小時(shí)內(nèi),而且是一邊一些地方有發(fā)車(chē)裝貨掃描、一邊一些地方有到車(chē)卸貨掃描,而人員操作主要集中在每天早上上班的1、2小時(shí)內(nèi)的早高峰階段、以及晚上下班發(fā)件方門(mén)店收到件以后,集中進(jìn)行快遞件收件確認(rèn)的操作,這幾個(gè)時(shí)間點(diǎn),在數(shù)千家網(wǎng)店的物流快遞公司內(nèi),都會(huì)短時(shí)間產(chǎn)生大量的并發(fā)壓力,這就是本文所要分析并優(yōu)化的問(wèn)題。
2高并發(fā)設(shè)計(jì)
當(dāng)前大多數(shù)業(yè)務(wù)系統(tǒng)都基于B/S架構(gòu)或者基于前端APP或本地gui+后端接口的架構(gòu),其本質(zhì)都是以HTTP通信協(xié)議為基礎(chǔ),可以將架構(gòu)簡(jiǎn)化為前端+http接口+后端業(yè)務(wù)邏輯+后端其它組件。
2.1前端架構(gòu)
前端的關(guān)鍵是清晰的功能和貼心的用戶體驗(yàn),其次才是絢麗的界面。業(yè)務(wù)邏輯設(shè)計(jì)上前端主要處理view層從后端接口下載的數(shù)據(jù),然后承載、小部分情況下緩存在本地,最終顯示。在需要的時(shí)候編輯相關(guān)數(shù)據(jù),然后作為接口參數(shù)回發(fā)給后端接口以便后端處理復(fù)雜的業(yè)務(wù)邏輯,而前端在這個(gè)過(guò)程中主要是初期驗(yàn)證回傳數(shù)據(jù)(確保調(diào)用后端接口前數(shù)據(jù)盡量是有效的,以免太多無(wú)意義的后端處理)和在大并發(fā)業(yè)務(wù)場(chǎng)景下某些場(chǎng)景的操作頻率限制,比如運(yùn)單錄入時(shí)候(收件),調(diào)用后端報(bào)價(jià)與折扣接口,按照某物流公司門(mén)店4千左右,單門(mén)店同時(shí)調(diào)取報(bào)價(jià)接口的設(shè)備以5個(gè)計(jì)算,設(shè)極端情況下50%客戶端同時(shí)訪問(wèn)后端為例,該場(chǎng)景點(diǎn)的性能極端情況瞬間就達(dá):4000*5*0.5=1w的訪問(wèn)次數(shù),假設(shè)后端的處理能力是1k每秒,這樣集中的請(qǐng)求需要10秒以上的時(shí)間來(lái)處理,那么可選的限制操作首先就是不允許重復(fù)使用這個(gè)功能,每5-10秒才允許使用一次,這樣確保盡量在短時(shí)間內(nèi)不會(huì)對(duì)后端產(chǎn)生太大的壓力,其次可以在請(qǐng)求后端接口前隨機(jī)增加若干秒的延遲,這樣也能大大降低極端情況下的壓力。
2.2后端架構(gòu)
后端的軟件架構(gòu)其設(shè)計(jì)上要遵循的原則頗多。
(1)容器無(wú)狀態(tài):最基礎(chǔ)的業(yè)務(wù)容器的無(wú)狀態(tài),常見(jiàn)的實(shí)際場(chǎng)景就是作為后端入口的http接口,這里所說(shuō)的業(yè)務(wù)容器主要是指asp.net的iis這類(lèi),當(dāng)然能夠獨(dú)立不需要外部webserver就能直接提供http服務(wù)的比如.net的owin規(guī)范的hostself的獨(dú)立exe方案來(lái)處理高并發(fā)短連接的http請(qǐng)求。之所以要保證無(wú)狀態(tài)是為了業(yè)務(wù)容器這一層可以配合負(fù)載均衡手段達(dá)到理論上無(wú)限擴(kuò)展實(shí)例,以期橫向擴(kuò)展性能。
(2)服務(wù)拆分:如果說(shuō)容器無(wú)狀態(tài)屬于微觀視角,那么大型系統(tǒng)應(yīng)做的縱向以及橫向拆分就是屬于準(zhǔn)宏觀視角,其中包括不同方面,拆分在軟件架構(gòu)層面主要就是1,按照層次拆分:接口層、業(yè)務(wù)邏輯層、底層基礎(chǔ)服務(wù)層等。2按照系統(tǒng)和模塊拆分:上層系統(tǒng)、下層系統(tǒng)自然不用說(shuō),業(yè)務(wù)上不同系統(tǒng)也一樣應(yīng)該拆分,在物流系統(tǒng)里比如對(duì)接電商的訂單管理系統(tǒng)和下一層的處理訂單轉(zhuǎn)成運(yùn)單后的運(yùn)單管理系統(tǒng)之間的關(guān)系就是電信的上下層級(jí)、同時(shí)又是不同業(yè)務(wù)系統(tǒng)的拆分,同層按照不同模塊應(yīng)該再行拆分,比如訂單處理系統(tǒng)里對(duì)電商的對(duì)接接口,處理訂單的處理容器等。3按照讀寫(xiě)拆分:在業(yè)務(wù)系統(tǒng)里最主要的行為就是讀與寫(xiě),而讀與寫(xiě)的側(cè)重是不同的,如果能在架構(gòu)設(shè)計(jì)上很好的針對(duì)性設(shè)計(jì),就能起到事半功倍的作用,很多時(shí)候這也是對(duì)系統(tǒng)吞吐量提高以及長(zhǎng)期迭代發(fā)展的重中之重,比如訂單業(yè)務(wù)處理主流程的各個(gè)不同業(yè)務(wù)模塊和電商調(diào)取物流系統(tǒng)里的物流軌跡系統(tǒng),就是典型的寫(xiě)跟讀的區(qū)別。
(3)異步處理:異步處理有不同層級(jí),軟件架構(gòu)中不同模塊或者業(yè)務(wù)處理行為之間數(shù)據(jù)流的異步,常見(jiàn)的異步處理可能利用的具體技術(shù)有:消息隊(duì)列比如rabbitmq或kafka、中間表、緩存比如:redis的list類(lèi)型。異步處理的意義:1、很多業(yè)務(wù)場(chǎng)景并發(fā)很大,如果想要全都實(shí)時(shí)同步處理,幾乎是不可能完成的任務(wù),那么在業(yè)務(wù)上稍微改變一下,使其可以異步處理或者延后執(zhí)行,這就解決了問(wèn)題。電商環(huán)境下秒殺類(lèi)的操作常用這種方式來(lái)應(yīng)對(duì)大并發(fā),每個(gè)并發(fā)第一時(shí)間最初的業(yè)務(wù)處理系統(tǒng)做的事可能僅僅是驗(yàn)證基本數(shù)據(jù)可用性,找一個(gè)地方存儲(chǔ),通常這個(gè)地方是隊(duì)列性質(zhì)的,然后由隊(duì)列的消費(fèi)者程序(群)來(lái)進(jìn)行消費(fèi)處理,當(dāng)然這個(gè)過(guò)程必然會(huì)加大單個(gè)請(qǐng)求的處理反應(yīng)時(shí)間,但是一般是可以接受的,在業(yè)務(wù)上會(huì)需要為延長(zhǎng)處理時(shí)間做一定的處理,比如加等待提示信息、加一定時(shí)間內(nèi)不可重復(fù)操作的限制等,而在物流里隊(duì)列異步場(chǎng)景很多,比如跨系統(tǒng)、跨模塊間的數(shù)據(jù)傳輸,通常都并不需要即時(shí),幾分鐘到一小時(shí)都在接收范圍內(nèi)。特別要注意異步處理應(yīng)有兩份數(shù)據(jù)可備查以作校驗(yàn),用高可用、同步復(fù)制的技術(shù)就可以做到,各種主流mq基本都支持或者使用主備復(fù)制的db方案,重要的異步數(shù)據(jù)有必要作定時(shí)驗(yàn)證。