大數(shù)據(jù)、云計算、分布式存儲系統(tǒng)、區(qū)塊鏈等新技術的提出,不斷創(chuàng)造出獨特的新互聯(lián)網(wǎng)模式,同時也向人們展示了去中心化分散基礎設施建立的模型?;诙嘣默F(xiàn)代倉儲系統(tǒng)也逐漸得到研究與重視,現(xiàn)代化的倉儲區(qū)域規(guī)劃與管理的智能化程度直接影響倉儲作業(yè)效率和儲存能力[1],這些現(xiàn)象在帶來海量數(shù)據(jù)頻繁存取問題[2]的同時,隨著倉儲企業(yè)規(guī)模的不斷擴大,也出現(xiàn)了物資可能會存放于不同部門、不同地域,尤其是多層級倉庫的貨品管理及各組織的倉庫資源賬目不能及時掌控庫存的情況,導致產生大量繁瑣數(shù)據(jù)、數(shù)據(jù)不統(tǒng)一、無法及時統(tǒng)計分析,造成倉儲企業(yè)管理效率低下的現(xiàn)象[3]。為了實現(xiàn)高效、智能化的企業(yè)倉庫管理,許多學者針對智能化倉儲管理系統(tǒng)應用進行了深入研究[4]。復旦大學的許嘉勛提出了一種基于云數(shù)據(jù)庫的企業(yè)資產管理,并以MongoDB數(shù)據(jù)庫為例,分析了MongoDB數(shù)據(jù)庫建模的可行性,設計并實現(xiàn)了一個基于MongoDB數(shù)據(jù)庫的高可靠、高擴展的分布式企業(yè)資產管理系統(tǒng)[5]。
在基于Web的架構中,數(shù)據(jù)庫難以實現(xiàn)橫向擴展[6],非關系數(shù)據(jù)庫中利用查詢語言對數(shù)據(jù)進行查詢沒有行的概念,數(shù)據(jù)在存儲的時候沒有固定的鍵值模式,一般都是通過文檔的形式進行存儲[7]。朱愛華等針對經典的倉儲信息服務系統(tǒng)大都使用關系型數(shù)據(jù)庫,結合前端交互技術以及非關系型數(shù)據(jù)庫MongoDB來搭建Web服務,并通過性能測試證明了該架構比傳統(tǒng)的數(shù)據(jù)庫操作在處理速度和資源占用上具有更好的性能優(yōu)勢[8]。文獻[9]也證明了在非關系型數(shù)據(jù)庫NoSQL中引入Web的架構系統(tǒng),可以利用NoSQL優(yōu)勢來彌補關系型數(shù)據(jù)庫的不足。
該文在充分研究分析非關系型數(shù)據(jù)庫MongoDB在分布式存儲方面的特性,利用前端開源框架Angular設計實現(xiàn)軟件邏輯操作功能;通過將Angular與RFID技術融合設計實現(xiàn)一種分布式智能倉儲管理系統(tǒng),并利用基于MongoDB云數(shù)據(jù)庫的高可用性構架特性將倉儲企業(yè)的各分支機構的數(shù)據(jù)存儲系統(tǒng)整合起來建立一個私有云,解決對異地分布的倉儲的物資、設備容量不斷擴容的需求與倉儲管理運營成本之間的矛盾,旨在為多站點多倉庫共享數(shù)據(jù)的倉儲系統(tǒng)Web管理應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。
針對建立數(shù)據(jù)倉庫時存在的系統(tǒng)需求不斷變化、語義斷層以及數(shù)據(jù)倉庫改動難、代價大等問題,建立數(shù)據(jù)倉庫采用分層架構是一種很常見的模式,也叫N層架構[10]。該文提出一種4層數(shù)據(jù)倉庫體系結構模型,包括表述層、控制層、業(yè)務邏輯層、數(shù)據(jù)庫物理層。系統(tǒng)分層結構示意參見圖1。
建立系統(tǒng)云架構,首先要解決的就是需對大量分散的數(shù)據(jù)進行分區(qū)存儲的問題,即將數(shù)據(jù)拆分并分散儲存在不同的服務器上。
該文利用MongoDB能夠支持數(shù)據(jù)自動分區(qū)的特性,將數(shù)據(jù)庫中的數(shù)據(jù)按相關屬性劃分成若干數(shù)據(jù)組,并將這些數(shù)據(jù)組分散到若干較大的分區(qū)中,每個分區(qū)負責總數(shù)據(jù)的一部分。系統(tǒng)主控程序中在對數(shù)據(jù)庫進行數(shù)據(jù)分區(qū)之前先建立兩個路由進程,一個是用于對多個分區(qū)的數(shù)據(jù)庫進行路由探測并提出連接申請的進程Mongo_sq;另一個是用于系統(tǒng)在沒有數(shù)據(jù)分區(qū)(隱藏數(shù)據(jù)分區(qū)的細節(jié))的時候提供給客戶端連接路由的進程Mongo_pt,可以實現(xiàn)在不修改系統(tǒng)程序的情況下對系統(tǒng)分布的節(jié)點進行增加或刪減。
具體的做法是在對系統(tǒng)進行數(shù)據(jù)分區(qū)時,從數(shù)據(jù)屬性集選擇某個具有代表性的字段作為一個共享“鍵”(Shard key),該“鍵”的鍵值即作為數(shù)據(jù)分區(qū)的主要依據(jù),并對這些鍵進行編號(如Shardkey_01,Shardkey_02,……)。如可以使用“倉庫ID”來定義各倉庫、產品存儲位置、庫位設置等數(shù)據(jù)庫或數(shù)據(jù)表的共享“鍵”,在此基礎上建立不同數(shù)據(jù)的分區(qū),并存放于不同的服務器或本地計算機上,當系統(tǒng)查詢“倉庫ID”如果是屬于“物資庫存管理”時即直接將該共享“鍵”有針對性地發(fā)送到“物資庫存管理”數(shù)據(jù)分區(qū)所在的服務器或本地計算機上,同樣,如果RFIDI設備掃描到的產品隸屬于某個倉庫,就直接將該產口的相關信息發(fā)送到對應的分區(qū)數(shù)據(jù)庫中。
云數(shù)據(jù)庫系統(tǒng)用例(包括普通用戶和管理員用戶)參見圖2。
普通管理員可以按照一定的需求條件申請所需的云數(shù)據(jù)庫(如果是企業(yè)外的用戶需繳納一定的費用才能獲得),通過系統(tǒng)自動分配成功后,提供給相應的普通管理用戶對相應云數(shù)據(jù)庫訪問的地址、端口及數(shù)據(jù)庫名稱等信息;相應地,如果普通管理員放棄對該數(shù)據(jù)庫的使用權,系統(tǒng)會根據(jù)自動對相關數(shù)據(jù)進行處理后回收該云數(shù)據(jù)庫所占用資源。
超級管理員通過硬件設備的管理功能子模塊、對普通管理員的管理子模塊以及對云數(shù)據(jù)庫的管理操作等對云數(shù)據(jù)庫進行訪問,包括設置綁定終端節(jié)點的ip地址,使得僅被綁定的ip才有權訪問選定云數(shù)據(jù)庫、為普通管理員用戶設定初始化的用戶名、登錄條件及啟/停云數(shù)據(jù)庫服務等功能。普通管理員對云數(shù)據(jù)庫的操作功能則主要包括通過啟/停云數(shù)據(jù)庫、更改用戶信息、變更數(shù)據(jù)庫訪問權限、日常功能維護以及通過倉庫管理系統(tǒng)對商品的信息采集與管理等功能模塊對云數(shù)據(jù)庫進行訪問。
系統(tǒng)高可用性架構(Replica Set)是MongoDB系統(tǒng)為了構建具有自動容錯及恢復功能的一項非常實用的高可用性方案[11]。該文提及的系統(tǒng)設計建立的基礎思想是,將一些位于同一地點或不同地點的服務器集合起來建立業(yè)務服務器云,數(shù)據(jù)庫層采用分布式的物理結構進行云架構,系統(tǒng)云架構示意參見圖3。
系統(tǒng)依據(jù)數(shù)據(jù)庫的規(guī)模設定一個或多個數(shù)據(jù)分區(qū)并配置相應的能夠表明數(shù)據(jù)位于哪個分區(qū)的共享數(shù)據(jù)元素“鍵”的拷貝,這樣就構成了一個Replica Set節(jié)點,每個節(jié)點可進一步分為一個或多個子節(jié)點,但每個節(jié)點須持有相同數(shù)據(jù)的拷貝。同時,還需定義主從節(jié)點,即一個節(jié)點為主節(jié)點,其他為從節(jié)點,且這些節(jié)點均需具有系統(tǒng)重構功能,即如果主節(jié)點出現(xiàn)故障,可選擇一個從節(jié)點自動承擔主節(jié)點的工作。
每個節(jié)點服務器需配置—個或多個路由器提出連接申請的進程Mongo_sq路由器提供給客戶端路由申請服務,并將請求分發(fā)到相應的數(shù)據(jù)分區(qū)服務器上。分區(qū)服務器配置內容主要包括服務器名稱、IP地址、端口三個方面。
其中端口配置的內容比較復雜,主要應包括:
(1)整個系統(tǒng)所有分區(qū)共享“鍵”(Shard key)訪問端口的分配(各個“鍵”可分配同一端口),該“鍵”的鍵值即作為數(shù)據(jù)分區(qū)的主要依據(jù),并對這些鍵進行編號(如Shardkey_01,Shardkey_02,……);
(2)用于訪問沒有數(shù)據(jù)分區(qū)的時候提供給客戶端連接路由的Mongo_pt端口;
(3)用于對多個分區(qū)的數(shù)據(jù)庫進行路由探測并提出連接申請的進程Mongo_sq;
(4)服務器配置詳細過程就不贅述。
對MongoDB數(shù)據(jù)庫操作必然會存在對各節(jié)點的文檔訪問操作的均衡性問題,而且須對這個均衡問題進行協(xié)調控制,否則系統(tǒng)很容易因為對某個節(jié)點文檔的高密度訪問而造成數(shù)據(jù)擁堵問題。
利用文獻[12]提出的基于數(shù)據(jù)操作的頻率(FODO)改進的均衡算法設計,以解決對數(shù)據(jù)庫操作的均衡問題,算法可描述如下:
(1)初始化。
設集群有p個節(jié)點,有d個文檔塊被集合在一起形成由MongoDB自動分隔的集群文檔;
(2)定義變量。
Int i=1,2,…,n;
Int Bi,Oi,Ii,Fi,Ci,DOi,DOi,λ;
Int SUM_DOi,SUM(SUM_DO);
//Bi是文檔塊數(shù),Oi、Ii、Fi、Ci分別存放對文檔塊的操作頻率、插入操作頻率、查詢操作頻率和更改操作頻率;DOi表示每個節(jié)點中文檔塊數(shù)據(jù)某個操作的頻率;SUM_DOi存放每個節(jié)點中所有文檔塊數(shù)據(jù)的所有操作頻率之和;λ表示調節(jié)負載均衡過程中分配各節(jié)點各文檔塊數(shù)據(jù)操作的比重參數(shù),SUM(SUM_DO)存放整個集群分區(qū)各個節(jié)點中數(shù)據(jù)操作頻率之和[13]。
(3)計算各節(jié)點各文檔塊數(shù)據(jù)操作頻率。
DOi=Oi∑i=1nOiDΟi=Οi∑i=1nΟi
(4)計算各節(jié)點各文檔塊數(shù)據(jù)所有操作頻率。
SUM_DOi=Ii∑i=1nIi+Fi∑i=1nFi+Ci∑i=1nCiSUΜ_DΟi=Ιi∑i=1nΙi+Fi∑i=1nFi+Ci∑i=1nCi
(5)計算帶有均衡修正系數(shù)λ(λ>1)的各節(jié)點各文檔塊數(shù)據(jù)所有操作頻率之和。
SUM_DOi=λIi∑i=1nIi+Fi∑i=1nFi+Ci∑i=1nCiSUΜ_DΟi=λΙi∑i=1nΙi+Fi∑i=1nFi+Ci∑i=1nCi
(6)計算整個分區(qū)的操作頻率可以用每個節(jié)點中所有文檔數(shù)據(jù)的操作頻率之和。
SUM(SUM_DO)=∑i=1nBi(SUM_DOi)_DΟ)=∑i=1nBi(SUΜ_DΟi)
其中λ是為了調整插入操作與查找、修改操作的均衡關系參數(shù)。由于MongoDB對數(shù)據(jù)的訪問與修改時會對前一次查詢過或修改過的數(shù)據(jù)進行記憶并將其保存到緩存中,當下一次需對這些訪問過的數(shù)據(jù)查詢或修改時相當于訪問的是本地緩存的數(shù)據(jù);MongoDB對每個分區(qū)的操作會提供一個包含分別承擔數(shù)據(jù)的寫、讀負載的primary和secondary兩個節(jié)點的replica set,使數(shù)據(jù)最大限度被利用。因此,MongoDB系統(tǒng)對數(shù)據(jù)插入操作負載的影響要比讀和寫操作負載的影響要大得多,尤其是每當在進行插入數(shù)據(jù)操作時,每一個數(shù)據(jù)塊所在的節(jié)點中的數(shù)據(jù)信息均會造成負載不均衡,而當不均衡的數(shù)據(jù)量達到一定程度時,系統(tǒng)的數(shù)據(jù)遷移閾值會觸發(fā)啟動,對不均衡的現(xiàn)象進行調節(jié),在這個過程中,系統(tǒng)資源被極大地浪費[14]。因此,為平衡插入與讀寫操作的比重,在計算插入操作頻率中增加一個系數(shù)調節(jié)參數(shù)λ(λ>1)[15],確保節(jié)點負載的均衡。
系統(tǒng)主要由統(tǒng)計分析、庫存管理、記錄查詢、產品管理、RFID讀頭管理、倉庫管理、系統(tǒng)設置七大部分組成。系統(tǒng)通過B/S(Browser/Server)結構進行布置,物料或貨品的基礎數(shù)據(jù)和系統(tǒng)對數(shù)據(jù)進行管理的程序可分別運行于不同的服務器,系統(tǒng)終端的控制程序可以同時運行于不同的微機上。
用戶對近期出庫入庫趨勢及流動物資總量有一個直接的了解,如庫存總量、入庫總量、出庫總量;
包括物資出庫、入庫、調撥、移庫、報損、盤點等功能;
針對物資操作后的記錄進行查詢,通過不同的搜索條件聚合查詢,快速準確地定位到用戶需要的記錄信息;
主要對批量標簽綁定商品的管理,設置了產品型號管理和商品添加功能,可以實現(xiàn)對單獨一個型號的產品管理;
依據(jù)不同環(huán)境下對不同的讀著性能進行調整設置;
每個倉庫中包含了多個門,門與讀頭屬于對應關系,以表明其出庫還是入庫屬性,倉庫內也有很多個庫位,庫位也包含了庫位容量、庫位屬性等屬性的設置、修改與綁定等功能;
超級管理員才有操作權限,可以添加普通管理員,修改賬號信息等。
頂層數(shù)據(jù)流主要描述管理員之間的角色數(shù)據(jù)關系,不同角色對應操作不同功能模塊,并將操作結果數(shù)據(jù)存儲到云端數(shù)據(jù)庫。管理員之間的數(shù)據(jù)流(頂層)參見圖4所示。
描述不同管理員與對應功能模塊的數(shù)據(jù)流向關系。超級管理員無權限限制,包括硬件信息管理、出庫、入庫、調撥、移庫、報損、盤點操作及記錄查詢、庫存查詢、對產品產品類型的定義、添加商品等功能。而普通管理員主要針對邏輯操作及查詢功能,沒有進行硬件信息管理的權限。管理員與對應功能模塊的數(shù)據(jù)流(第二層)參見圖5。
數(shù)據(jù)庫的設計充分考慮業(yè)務場景、數(shù)據(jù)讀寫頻率、安全一致性等方面的需求,以及主節(jié)點服務器出現(xiàn)系統(tǒng)崩潰后能夠迅速切換到其他節(jié)點,采用MongoDB分布式副本集架構為基礎,共設計了6張表:用戶信息表、倉庫表、商品信息表、倉庫門信息表、倉庫位信息表、商品庫存表。
用戶名、用戶密碼、用戶ID、用戶角色、用戶郵箱;
倉庫ID、倉庫名稱、管理員、倉庫地址、屬性;
商品序列號、編號、名稱、生產日期、商品EPC碼、商品NFC碼、型號、類別、圖片地址;
門ID、名稱、類型,庫位ID、庫位名稱、庫位規(guī)模;
所屬倉庫、倉庫位ID、管理員、倉庫地址、倉庫位規(guī)模、當前存放量;
商品序列號、編號、名稱、入庫時間、商品EPC碼、商品NFC碼、型號、類別,倉庫編號、倉庫名稱、庫位編號、庫位名稱等。
前端使用Angular封裝的httpClient模塊,在ng-alain中又被封裝成更為便捷的httpClient方法,可以很方便地自動添加請求頭并處理返回的對應的數(shù)據(jù)格式,其實質上仍然還是使用http方法請求數(shù)據(jù),返回的數(shù)據(jù)用rxjs中的observable訂閱處理。該文的數(shù)據(jù)接口用postman軟件進行梳理和測試、調試,最后將所有項目打包部署在服務器上。為了數(shù)據(jù)安全,運行中的數(shù)據(jù)請求應用改為https請求。
著重介紹登錄,RFID讀頭管理,庫存管理中的入庫、出庫、調撥、移庫、報損、盤點,并以登錄功能實現(xiàn)主要代碼及登錄主界面、RFID讀頭管理主界面截圖(其他模塊的界面圖略)為例。
登錄模塊主要是在用戶輸入時進行了表單驗證和登錄失敗時提示信息,并且在登錄成功后顯示用戶頭像、用戶郵箱等信息。在Session Storage中存儲用戶角色以及攜帶的Token,Token精度設置在秒,有效期為兩個小時。用戶登錄主界面參見圖6,實現(xiàn)代碼可簡單表述如下(其他功能模塊的實現(xiàn)代碼詳略)。
//清空路由復用信息
this.reuseTabService.clear(); //設置用戶Token信息
this.tokenService.set(res);
//重新獲取StartupService內容,信息一般都會受當前用戶授權范圍而影響
const user={
name:res.name,//avatar:res.avatar,avatar:'./assets/tmp/img/avatar.jpg',userId:res.id,
};
this.settingsService.setUser(user);this.startupSrv.load().then(()=>{let url=this.tokenService.referrer.url||'/';
if (url.includes('/passport')) url='/';
this.router.navigateByUrl(url);
});
}
讀頭設置需要先獲取模式等相關硬件參數(shù),包括讀寫器硬件屬性信息、射頻輸出功率、天線、蜂鳴器、標簽過濾規(guī)則等,可依據(jù)不同的場景的需要調整讀頭配置。讀頭詳細功能設置參見圖7。
利用數(shù)據(jù)實時傳輸通信功能的ngx-mqtt插件,獲取倉庫/門主題并將接收到的數(shù)據(jù)存入數(shù)據(jù)庫提供給查詢系統(tǒng),將得到相應的商品信息轉換成用戶需要的格式展示在表格中,并在表格的底部顯示匯總統(tǒng)計信息。操作員確認后點擊入庫按鈕、填寫入庫單號、選擇庫位、提交入庫。
商品出庫功能先進行掃描然后過濾重復的商品信息,填寫出庫單號,執(zhí)行出庫。與入庫操作不同的是,出庫時掃描的商品是在庫存里查找,入庫的信息則是在商品信息庫中查找。
調撥是物資從一個倉庫轉移到另一個倉庫的過程,拆分開就是先執(zhí)行出庫再入庫,在執(zhí)行調撥時需要選擇目的倉庫,在目的倉庫入庫時選擇庫位就完成了整個調撥過程。
移庫與調撥是不同的概念,是在同一個倉庫內不同的庫位周轉的過程。在確認物資信息正確之后選擇新庫位與舊庫位,執(zhí)行移庫操作。
在物資使用或者存放過程中會出現(xiàn)損壞情況,報損功能為了及時分離這些損壞商品,功能流程與出庫一致。找出損壞商品,讀頭掃描,執(zhí)行報損,數(shù)據(jù)庫實時更新報損數(shù)據(jù),并做統(tǒng)計。
按照倉庫管理的要求,需要進行不定期的盤點。前端網(wǎng)頁按照需要盤點的物資條件查詢到指定商品,生成盤點信息單,發(fā)送到手持機,手持機拉取盤點單,在指定庫位進行掃描,將掃描結果進行對比,將結果展示給操作員。
記錄查詢主要是搜索條件比較多,接口也相應地做了聚合查詢??梢詥螚l查詢,也可以多條。正因為搜索條件較多,為了得到更好的用戶體驗也加上了清除功能,用來清除表單中已經有的值,方便重新輸入。查詢結果中,查看按鈕對應每條數(shù)據(jù)的詳情單,可以選擇查看并打印。
調撥與盤點、報損、移庫搜索條件均為相應單號和操作時間,搜索結果以單號分類,點擊單條單跳轉到相應的單詳情頁,所有的詳情單提供導出pdf功能。
在項目中是沒有出現(xiàn)過硬件信息這條的,但是因為從倉庫到讀頭、庫位、門這些都屬于硬件范疇。而且規(guī)劃好了之后一般是不會去修改的,所以就把它們統(tǒng)一劃分到硬件范疇,但是功能還是獨立的,也設置了單獨的功能頁面。
人員管理主要針對密碼和郵箱的修改。這是只有超級管理員才有的權限。如果需要添加超級管理員賬號需要聯(lián)系我們在數(shù)據(jù)庫添加,這也保證了一定程度的數(shù)據(jù)安全。
通過非關系數(shù)據(jù)庫系統(tǒng)建立分布式云存儲系統(tǒng),針對在多點多級倉儲管理系統(tǒng)所涉及的復雜應用管理,系統(tǒng)結合RFID技術對物資二維碼標簽進行唯一性的識別,以使系統(tǒng)管理的可靠性、穩(wěn)定性得到有力的保證。系統(tǒng)綜合考慮倉儲業(yè)務多元化發(fā)展的需求,探索了在同構系統(tǒng)中將分布式數(shù)據(jù)庫與云存儲原理結合在倉儲企業(yè)的應用,對于異地性、分布式的倉儲企業(yè)的大規(guī)模物品管理具有一定的借鑒意義,系統(tǒng)也可拓展應用于其他具有分布式需求的企業(yè)倉儲管理。下一步將從兩個方面進一步開展研究:(1)在異構系統(tǒng)中對信息查詢訪問、數(shù)據(jù)庫之間的數(shù)據(jù)遷移、數(shù)據(jù)歸并、所定義的數(shù)據(jù)結構等方面的性能評價還需做進一步的探索與研究;(2)該文只是涉及設計實現(xiàn)分布式倉儲管理系統(tǒng)的關鍵功能,但對各不同倉儲系統(tǒng)的權限、角色、功能等的可擴展性還需進一步研究。
上一篇: 云倉儲平臺在護理實訓室信息化管理中的應用
下一篇: 倉儲的變革——云倉
權所有©:上海陽合儲運
專業(yè)承接上海倉庫租賃、上海倉儲配送物流、上海電商倉儲企業(yè)服務與微笑同在"的先進理念不斷發(fā)展壯大。