許 敏 史熒中 張 悅
(1.無(wú)錫職業(yè)技術(shù)學(xué)院 物聯(lián)網(wǎng)技術(shù)學(xué)院,江蘇 無(wú)錫 214121;2.無(wú)錫超正軟件有限公司,江蘇 無(wú)錫 214153)
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,全球已進(jìn)入網(wǎng)絡(luò)經(jīng)濟(jì)時(shí)代,電子商務(wù)將互聯(lián)網(wǎng)技術(shù)運(yùn)用到傳統(tǒng)的銷(xiāo)售行業(yè),實(shí)現(xiàn)了從生產(chǎn)、倉(cāng)儲(chǔ)、運(yùn)輸?shù)戒N(xiāo)售環(huán)節(jié)的重大變革。艾瑞數(shù)據(jù)顯示,2016年中國(guó)電子商務(wù)市場(chǎng)交易規(guī)模達(dá)20.2萬(wàn)億元,增速為23.6%,其中,網(wǎng)絡(luò)購(gòu)物增長(zhǎng)23.9%,成為推動(dòng)電子商務(wù)市場(chǎng)發(fā)展的重要力量之一[1]。繁榮的交易背后離不開(kāi)大量用戶和網(wǎng)店管理者的積極參與,也離不開(kāi)交易管理、倉(cāng)儲(chǔ)管理、物流管理等系統(tǒng)的高效支持。
當(dāng)前電子商務(wù)與現(xiàn)代物流的蓬勃發(fā)展對(duì)倉(cāng)儲(chǔ)管理系統(tǒng)提出了新的需求。早期的倉(cāng)儲(chǔ)管理是簡(jiǎn)單、靜態(tài)的對(duì)貨物儲(chǔ)存的管理,主要依靠人工記憶和手工錄入,不但費(fèi)時(shí)費(fèi)力,而且容易出錯(cuò)。隨著信息技術(shù)的發(fā)展,手工記賬逐漸轉(zhuǎn)變成電子記賬,通過(guò)信息化手段對(duì)倉(cāng)儲(chǔ)管理中的入庫(kù)、出庫(kù)、庫(kù)位、庫(kù)存等全方位的記錄與分析,解決了倉(cāng)儲(chǔ)管理中賬目不清晰的問(wèn)題[2-4]。RFID技術(shù)及人工智能的發(fā)展又推動(dòng)倉(cāng)儲(chǔ)管理向自動(dòng)化、智能化發(fā)展[5-10]。現(xiàn)階段電子商務(wù)的發(fā)展又對(duì)倉(cāng)儲(chǔ)管理提出新的要求,鑒于電商企業(yè)經(jīng)常會(huì)做一些公開(kāi)的促銷(xiāo)活動(dòng)的經(jīng)營(yíng)特點(diǎn),銷(xiāo)售訂單在活動(dòng)期間會(huì)呈幾何級(jí)數(shù)的增長(zhǎng),傳統(tǒng)的人工審核銷(xiāo)售單或手工添加庫(kù)存信息已經(jīng)不能適應(yīng)經(jīng)營(yíng)需求,需要開(kāi)發(fā)新的功能以盡量避免手工作業(yè),也避免高并發(fā)時(shí)用戶需要等待的情形。
對(duì)于電商企業(yè)來(lái)講,高并發(fā)是一種“甜蜜的煩惱”,電商企業(yè)對(duì)此是既歡迎又擔(dān)心。大量用戶能在自己的平臺(tái)上蜂擁購(gòu)物,顯然是電商企業(yè)追求的目標(biāo),但高并發(fā)會(huì)形成對(duì)服務(wù)器資源的持續(xù)性占有,當(dāng)并發(fā)數(shù)超過(guò)一定臨界點(diǎn)后,會(huì)造成服務(wù)器阻塞,導(dǎo)致應(yīng)用系統(tǒng)性能直線下降,可能影響用戶的購(gòu)物體驗(yàn)。對(duì)于注重用戶體驗(yàn)感的電商企業(yè)來(lái)講,高并發(fā)的處理尤為關(guān)鍵,因而在技術(shù)架構(gòu)的設(shè)計(jì)上要充分考慮到這些因素。
圍繞倉(cāng)儲(chǔ)管理的自動(dòng)化、智能化,學(xué)者們開(kāi)展了眾多研究,基于RFID技術(shù)的倉(cāng)儲(chǔ)管理系統(tǒng)能進(jìn)行托盤(pán)、包裝箱、貨物信息的自動(dòng)收集[5-6];人工智能技術(shù)促進(jìn)了倉(cāng)庫(kù)的布局優(yōu)化、成本控制[7-10]。
當(dāng)前對(duì)倉(cāng)儲(chǔ)管理研究與實(shí)踐的重點(diǎn)是與電子商務(wù)、現(xiàn)代物流的對(duì)接[11-12]。在倉(cāng)儲(chǔ)管理與電子商務(wù)的對(duì)接中,客戶(買(mǎi)家)、網(wǎng)上店鋪(賣(mài)家)及倉(cāng)儲(chǔ)管理系統(tǒng)是三個(gè)獨(dú)立又相關(guān)的部分。客戶通過(guò)網(wǎng)上店鋪下單,賣(mài)家將訂單轉(zhuǎn)發(fā)至倉(cāng)儲(chǔ)管理系統(tǒng),倉(cāng)儲(chǔ)管理系統(tǒng)對(duì)訂單進(jìn)行審核,并將審核結(jié)果返回給賣(mài)家及客戶,如圖1所示。傳統(tǒng)的訂單處理是由人工審核的,在高并發(fā)時(shí)會(huì)出現(xiàn)較長(zhǎng)的等待審核時(shí)間,存在著性能瓶頸。
隨著電子商務(wù)的發(fā)展,倉(cāng)儲(chǔ)管理的性能及安全性得到越來(lái)越多的重視,在淘寶、京東等大型購(gòu)物網(wǎng)站上也得到了實(shí)踐應(yīng)用。淘寶、京東的“雙十一”大促,要求倉(cāng)儲(chǔ)管理系統(tǒng)實(shí)時(shí)性高、響應(yīng)快、能解決高并發(fā)問(wèn)題。企業(yè)通常會(huì)從兩方面來(lái)解決應(yīng)用系統(tǒng)的高并發(fā)負(fù)載壓力,一是提升服務(wù)器的硬件配置水平,如購(gòu)買(mǎi)性能更加優(yōu)良的服務(wù)器,更大內(nèi)存、更快速的CPU,更多的CPU個(gè)數(shù)等;二是優(yōu)化應(yīng)用系統(tǒng)的架構(gòu)設(shè)計(jì),提高服務(wù)器資源的利用率,降低用戶請(qǐng)求的資源占有率,從而提升系統(tǒng)的并發(fā)承載能力。從中小企業(yè)的角度來(lái)看,考慮到成本問(wèn)題,大型購(gòu)物網(wǎng)站所選用的拆分系統(tǒng)、災(zāi)備切換、 分流(水平擴(kuò)展)、限流(超預(yù)期流量)等技術(shù)方案很難直接應(yīng)用于中小型電商網(wǎng)站。另外,如果把自己的業(yè)務(wù)托管到大型購(gòu)物平臺(tái),如京東、淘寶等,那么自己的客戶資源就會(huì)被暴露出來(lái),無(wú)形中降低了競(jìng)爭(zhēng)力。因而,如何在適度成本下為中小型電商企業(yè)設(shè)計(jì)并開(kāi)發(fā)高效、安全的獨(dú)立倉(cāng)儲(chǔ)管理系統(tǒng),有著現(xiàn)實(shí)的需求。
針對(duì)這類需求,本研究設(shè)計(jì)并開(kāi)發(fā)基于Redis的高并發(fā)倉(cāng)儲(chǔ)管理系統(tǒng)(WareHouse Management System, WMS)。該系統(tǒng)實(shí)現(xiàn)了倉(cāng)儲(chǔ)管理系統(tǒng)入庫(kù)、出庫(kù)、庫(kù)存管理等基本功能,并具有如下特性:
(1) 該WMS系統(tǒng)獨(dú)立于已有ERP系統(tǒng),并通過(guò)接口進(jìn)行對(duì)接;

圖1 具有自動(dòng)審核訂單功能的倉(cāng)儲(chǔ)管理系統(tǒng)
(2) 采用基于JWT的Token認(rèn)證機(jī)制在用戶和服務(wù)器間傳遞信息,節(jié)約系統(tǒng)開(kāi)銷(xiāo);
(3) 銷(xiāo)售出庫(kù)管理模塊采用Lumen框架的隊(duì)列和Redis緩存技術(shù)實(shí)現(xiàn)高并發(fā)控制。
本系統(tǒng)設(shè)計(jì)倉(cāng)儲(chǔ)管理系統(tǒng)在入庫(kù)操作中,自動(dòng)給出倉(cāng)庫(kù)空余庫(kù)位的信息,增加入庫(kù)操作的執(zhí)行效率;在出庫(kù)操作中,采用Lumen框架中的隊(duì)列和Redis高并發(fā)數(shù)據(jù)處理技術(shù),實(shí)現(xiàn)出庫(kù)操作的高并發(fā)處理,解決人工記錄時(shí)間成本大、效率低、錯(cuò)誤率高的問(wèn)題,以及已有中小型WMS系統(tǒng)無(wú)法實(shí)現(xiàn)的高并發(fā)問(wèn)題;此外,出庫(kù)、入庫(kù)的自動(dòng)化操作,可以合理給出庫(kù)存調(diào)度的方案,使得庫(kù)存盤(pán)點(diǎn)、報(bào)表生成省時(shí)省力。綜合上面分析,最終所設(shè)計(jì)的系統(tǒng)分成基礎(chǔ)信息管理、權(quán)限管理、銷(xiāo)售出庫(kù)管理、入庫(kù)管理、庫(kù)存管理、接口管理及報(bào)表統(tǒng)計(jì)等七大模塊,功能模塊如圖2所示。

圖2 倉(cāng)儲(chǔ)管理系統(tǒng)功能模塊
本系統(tǒng)有完善的API接口,可以通過(guò)接口和ERP、進(jìn)銷(xiāo)存等其他第三方平臺(tái)實(shí)現(xiàn)對(duì)接,完成銷(xiāo)售單,采購(gòu)單自動(dòng)接收操作,避免訪問(wèn)第三方平臺(tái)數(shù)據(jù)庫(kù),增強(qiáng)了系統(tǒng)的通用性;同時(shí)避免手動(dòng)添加單據(jù),以減少用戶的工作量。平臺(tái)方傳遞到WMS系統(tǒng)的接口設(shè)置如表1所示。
下面介紹本倉(cāng)儲(chǔ)管理系統(tǒng)與已有第三方平臺(tái)的通信過(guò)程。系統(tǒng)需要接收的數(shù)據(jù)有兩個(gè),分別是接收第三方平臺(tái)發(fā)送的銷(xiāo)售單,作為倉(cāng)儲(chǔ)管理系統(tǒng)出庫(kù)操作的啟動(dòng)事件;接收第三方平臺(tái)發(fā)送的采購(gòu)單,作為倉(cāng)儲(chǔ)管理系統(tǒng)入庫(kù)操作的啟動(dòng)事件。以接收銷(xiāo)售單為例,介紹本系統(tǒng)與第三方系統(tǒng)對(duì)接的算法。

表1 平臺(tái)方傳遞到WMS系統(tǒng)的參數(shù)說(shuō)明
首先,介紹兩個(gè)系統(tǒng)間數(shù)據(jù)傳遞格式及內(nèi)容。
本倉(cāng)儲(chǔ)管理系統(tǒng)開(kāi)放一個(gè)接口,供第三方平臺(tái)發(fā)送銷(xiāo)售單信息。兩個(gè)系統(tǒng)之間采用JSON格式傳遞數(shù)據(jù)。JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,JSON數(shù)據(jù)格式簡(jiǎn)單,讀寫(xiě)方便;且JSON格式壓縮,占用資源少,便于網(wǎng)絡(luò)傳輸。
經(jīng)雙方協(xié)議,發(fā)送數(shù)據(jù)格式為報(bào)文、密文、客戶編號(hào)和時(shí)間戳。其中,報(bào)文是銷(xiāo)售單信息,包括銷(xiāo)售單號(hào)、銷(xiāo)售商品信息等信息;加密簽名是將商家編號(hào)、報(bào)文、密鑰按照協(xié)議的順序,進(jìn)行MD5加密后的內(nèi)容;客戶編號(hào)是倉(cāng)儲(chǔ)管理系統(tǒng)已登記的客戶編號(hào);時(shí)間戳是第三方平臺(tái)發(fā)送請(qǐng)求時(shí)的時(shí)間戳;密鑰由第三方平臺(tái)和倉(cāng)儲(chǔ)管理系統(tǒng)共享。倉(cāng)儲(chǔ)管理系統(tǒng)接收到JSON數(shù)據(jù)后,會(huì)對(duì)其進(jìn)行驗(yàn)證解析。接著,WMS接收第三方平臺(tái)所發(fā)送的JSON格式數(shù)據(jù)后,JSON數(shù)據(jù)進(jìn)行解析,獲得客戶編號(hào)、請(qǐng)求時(shí)間戳、訂單信息和密文。為了驗(yàn)證數(shù)據(jù)網(wǎng)絡(luò)傳輸?shù)耐暾裕枰獙?duì)獲得數(shù)據(jù)進(jìn)行驗(yàn)證。密文驗(yàn)證的目的是驗(yàn)證網(wǎng)絡(luò)傳輸數(shù)據(jù)時(shí),有無(wú)丟失數(shù)據(jù),WMS利用密鑰加密后的報(bào)文和加密簽名相同,則可保證網(wǎng)絡(luò)傳輸數(shù)據(jù)的完整性。最后,驗(yàn)證報(bào)文信息。首先對(duì)獲得Http格式的字符串進(jìn)行解碼,將信息轉(zhuǎn)換成字符串?dāng)?shù)組,獲取存放在報(bào)文中的各項(xiàng)訂單信息。接著,從數(shù)據(jù)庫(kù)中查詢報(bào)文解析出的訂單號(hào),根據(jù)訂單實(shí)際情況,返回“審核中”“審核通過(guò)”“訂單重復(fù)發(fā)送”“訂單數(shù)據(jù)不正確”等信息給第三方平臺(tái)。
系統(tǒng)采用基于JWT(JSON Web Token)的Token認(rèn)證機(jī)制實(shí)現(xiàn)用戶和服務(wù)器之間的信息傳遞。一旦用戶完成了登陸,在接下來(lái)的每個(gè)請(qǐng)求中包含JWT,用來(lái)驗(yàn)證用戶身份以及對(duì)路由、服務(wù)和資源的訪問(wèn)權(quán)限進(jìn)行驗(yàn)證。
傳統(tǒng)的用戶登錄認(rèn)證中,通常采用session方式。用戶登錄成功,服務(wù)端會(huì)保存一個(gè)session,客戶端會(huì)把sessionId保存在cookie中,每次請(qǐng)求都會(huì)攜帶這個(gè)sessionId。“cookie+session”模式通常是保存在內(nèi)存中,隨著用戶量的增多,開(kāi)銷(xiāo)就會(huì)越大,不適用高并發(fā)場(chǎng)景。JWT認(rèn)證只需服務(wù)端生成token,客戶端保存這個(gè)token,每次請(qǐng)求攜帶這個(gè)token,服務(wù)端認(rèn)證解析即可。JWT的構(gòu)成非常簡(jiǎn)單,字節(jié)占用很小,便于傳輸,它不需要在服務(wù)端保存會(huì)話信息,易于應(yīng)用的擴(kuò)展。
以登錄功能為例,前端接收用戶輸入的賬戶和密碼,通過(guò)ajax post傳遞到后端指定的URL登錄接口,后端接收到數(shù)據(jù)后,訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)器,驗(yàn)證賬戶密碼是否合法,若合法,返回token令牌到前端,之后的用戶操作都需要進(jìn)行token認(rèn)證,如圖3所示。

圖3 基于JWT的Token認(rèn)證
在傳統(tǒng)處理訂單模式中,ERP系統(tǒng)將訂單信息發(fā)送給倉(cāng)儲(chǔ)管理系統(tǒng),倉(cāng)儲(chǔ)管理系統(tǒng)讀取庫(kù)存,判斷庫(kù)存是否符合要求,增減庫(kù)存,然后修改訂單,完成上述一系列操作后才會(huì)返回訂單處理結(jié)果,如圖4所示。它的缺點(diǎn)是高并發(fā)狀態(tài)下,用戶等待系統(tǒng)處理時(shí)間過(guò)長(zhǎng)。
為了解決高并發(fā)問(wèn)題,本系統(tǒng)的設(shè)計(jì)方案是:ERP推送訂單,倉(cāng)儲(chǔ)管理系統(tǒng)審核訂單信息是否完整,如果訂單信息符合要求,則將訂單信息存入隊(duì)列池,同時(shí)通知ERP系統(tǒng)接單成功。這樣做的好處是可以及時(shí)對(duì)用戶操作做出響應(yīng),提高用戶的體驗(yàn)感。接著系統(tǒng)使用Lumen框架下的隊(duì)列來(lái)依次處理訂單,完成判斷庫(kù)存,增減庫(kù)存,修改訂單一系列操作,如圖5所示。

圖4 傳統(tǒng)的WMS出庫(kù)訂單處理模式

圖5 本倉(cāng)儲(chǔ)管理系統(tǒng)的出庫(kù)訂單處理模式
雖然該設(shè)計(jì)可以及時(shí)對(duì)客戶訂單做出響應(yīng),但存入隊(duì)列池的訂單,還需進(jìn)行判斷庫(kù)存等一系列操作,又需要依次從隊(duì)列池讀取訂單信息,頻繁讀寫(xiě)數(shù)據(jù)庫(kù)操作會(huì)造成系統(tǒng)性能下降,所以將隊(duì)列放到Redis緩存中,加快訂單處理速度。在完成判斷庫(kù)存、增減庫(kù)存、修改訂單等一系列操作后,倉(cāng)儲(chǔ)管理系統(tǒng)會(huì)異步通知ERP系統(tǒng)訂單的處理結(jié)果。
3.3.1高并發(fā)性能的出庫(kù)管理實(shí)現(xiàn)流程 第一步,ERP系統(tǒng)向倉(cāng)儲(chǔ)管理系統(tǒng)發(fā)送訂單。第二步,WMS系統(tǒng)接收到訂單,解析出訂單信息進(jìn)入隊(duì)列,存儲(chǔ)在MySQL的jobs表中,如圖6所示,同時(shí)系統(tǒng)給第三方平臺(tái)發(fā)送“待審核”消息,表示已經(jīng)收到訂單。接著按隊(duì)列中的順序逐一讀取jobs表中的訂單信息,完成各個(gè)訂單的審核流程。第三步,審核隊(duì)列中的訂單。在與第三方對(duì)接模塊驗(yàn)證銷(xiāo)售單格式合法性后,就將訂單信息推送到系統(tǒng)隊(duì)列中。隊(duì)列先判斷當(dāng)前訂單的貨物數(shù)量是否足夠,若足夠就鎖定庫(kù)存數(shù)量、更新庫(kù)存信息。第四步,訂單處理后,異步返回客戶“等待關(guān)聯(lián)發(fā)貨單”。

圖6 隊(duì)列池中的訂單信息
3.3.2Redis緩存技術(shù)實(shí)現(xiàn)出庫(kù)操作 需指出的是,將訂單信息存入jobs表進(jìn)行隊(duì)列排隊(duì),訂單審核時(shí),又要從jobs表中讀取銷(xiāo)售單信息,在大批量訂單高并發(fā)時(shí),頻繁地寫(xiě)入和讀取數(shù)據(jù)表中數(shù)據(jù),會(huì)導(dǎo)致系統(tǒng)性能降低。故本系統(tǒng)提出采用Redis技術(shù)提高系統(tǒng)的性能。
Lumen框架支持當(dāng)前流行的緩存后端,可以為各種不同的緩存系統(tǒng)提供統(tǒng)一的API,如Memcached和Redis。本系統(tǒng)選用Redis內(nèi)存數(shù)據(jù)庫(kù)解決高并發(fā)問(wèn)題。
Redis的配置步驟
(1) 安裝Redis
(2) 通過(guò)Composer安裝predis/predis
(3) 在wmsvendorlaravellumen-frameworkconfigdatabase.php文件中添加redis設(shè)置:
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
]
如果redis和web服務(wù)器不是同一臺(tái)機(jī)器,需要更改IP和相應(yīng)端口。
在Lumen框架中配置Redis緩存,Mysql數(shù)據(jù)庫(kù)中保存隊(duì)列信息的jobs表中的數(shù)據(jù)就會(huì)存儲(chǔ)在Redis內(nèi)存數(shù)據(jù)庫(kù)中,對(duì)銷(xiāo)售單信息的寫(xiě)入和讀取就在內(nèi)存上進(jìn)行,以保證高并發(fā)狀態(tài)下,系統(tǒng)的實(shí)時(shí)性和有效性。
本研究所設(shè)計(jì)的系統(tǒng)具有三大特點(diǎn):本系統(tǒng)實(shí)現(xiàn)了API接口開(kāi)發(fā),只要按照接口文檔接收和發(fā)送數(shù)據(jù),就可以和任意第三方平臺(tái)進(jìn)行對(duì)接,從而有效降低開(kāi)發(fā)成本。平臺(tái)具有較強(qiáng)的通用性,具有廣闊的應(yīng)用前景。本系統(tǒng)采用基于JWT的Token認(rèn)證機(jī)制實(shí)現(xiàn)用戶和服務(wù)器之間的信息傳遞。一旦用戶完成了登錄,服務(wù)端只需生成token,客戶端保存這個(gè)token,每次請(qǐng)求攜帶這個(gè)token,服務(wù)端認(rèn)證解析即可。這種方式不需要在服務(wù)端保存會(huì)話信息,緩解服務(wù)器壓力,易于應(yīng)用的擴(kuò)展。本系統(tǒng)基于Lumen隊(duì)列和Redis緩存技術(shù)處理出庫(kù)訂單,系統(tǒng)在接到第三方銷(xiāo)售單驗(yàn)證通過(guò)后,立即返回用戶“待審核”狀態(tài),并同將銷(xiāo)售單信息存入隊(duì)列等待處理,該策略將出庫(kù)隊(duì)列的寫(xiě)入和讀取放在Redis內(nèi)存數(shù)據(jù)庫(kù)中進(jìn)行,減少了程序讀寫(xiě)MySQL數(shù)據(jù)庫(kù)的次數(shù),提高了運(yùn)行速度。同時(shí),使用隊(duì)列單線程處理銷(xiāo)售訂單,修改庫(kù)存信息,確保了數(shù)據(jù)的一致性。