石清
摘? 要:在“互聯(lián)網(wǎng)+”概念的影響下,越來越多的信息技術應用于體育產業(yè)。本文通過構建基于MEAN框架的體育競賽實時數(shù)據(jù)管理系統(tǒng),設計了一種結合本地存儲與遠端云數(shù)據(jù)庫的分布式存儲方案,既實現(xiàn)數(shù)據(jù)的實時分享,又保障數(shù)據(jù)的可靠性。并通過實驗的方式比較了基于HTML5 Local Storage本地存儲的兩種方法與本地NoSQL數(shù)據(jù)庫的性能差異,從而實現(xiàn)系統(tǒng)存儲方案的優(yōu)化。
關鍵詞:實時數(shù)據(jù)共享;競賽系統(tǒng);MEAN框架;RESTful接口
中圖分類號:TP311? ? ?文獻標識碼:A
Abstract: Under the influence of the Internet + concept, more and more information technology is used in sports industry. By constructing a real-time data management system for sports competitions based on the MEAN (MongoDB +
Express + AngularJS + NodeJS) framework, this paper proposes to design a distributed storage scheme that combines local storage and remote cloud database, which realizes real-time data sharing and guarantees data reliability. Performance difference between the two methods based on HTML5 Local Storage and local NOSQL (Not Only SQL) database is compared through experiment, so to optimize the system storage scheme.
Keywords: real-time data sharing; competition system; MEAN framework; RESTful interface
1? ?引言(Introduction)
隨著互聯(lián)網(wǎng)信息技術的發(fā)展,云計算和云數(shù)據(jù)庫以其可伸縮性、高可靠性等特點受到了開發(fā)者和企業(yè)的青睞,越來越多的企業(yè)將其服務和數(shù)據(jù)轉移到云上。這些海量的數(shù)據(jù)如果可以通過接口的形式實現(xiàn)共享,將為大數(shù)據(jù)的分析和挖掘提供數(shù)據(jù)。然而沖突數(shù)據(jù)和時效錯誤數(shù)據(jù)相疊加而產生的錯誤數(shù)據(jù)將產生嚴重的后果,德國數(shù)據(jù)分析機構的調查顯示:美國每年因為劣質數(shù)據(jù)而造成的損失高達6,000 億美元[1]。因此,保證數(shù)據(jù)的可靠性乃是數(shù)據(jù)最重要的因素之一,建立在低質量數(shù)據(jù)基礎之上的數(shù)據(jù)分析、數(shù)據(jù)挖掘將會變成一紙空談,甚至會產生重大的錯誤。
有時為了確保數(shù)據(jù)的可靠性,往往會以犧牲數(shù)據(jù)的實時性為代價。而體育賽事信息的變動和不確定性,要求信息傳播最大程度地追求時效性與接收的便捷性[2]。而傳統(tǒng)競賽服務系統(tǒng)多采用C/S構架,前期需要較大的硬件成本投入,同時開發(fā)周期長、成本高,除個別大型綜合性賽事外,單項體育比賽的競賽系統(tǒng)幾乎不具備實時分享數(shù)據(jù)的能力。而基于B/S
架構的系統(tǒng)除了開發(fā)周期端、成本低、系統(tǒng)可擴展性高之外,數(shù)據(jù)信息服務通過連接特定的數(shù)據(jù)接口,實現(xiàn)數(shù)據(jù)實時通訊,既能服務于電視直播、現(xiàn)場大屏幕的數(shù)據(jù)需求,還能為所有對實時數(shù)據(jù)有需求的應用提供數(shù)據(jù)支持。賽后,所有的數(shù)據(jù)還可用于其他分享和數(shù)據(jù)挖掘,以達到數(shù)據(jù)價值利用最大化。本文研究的目的就是建立一套體育競賽數(shù)據(jù)管理系統(tǒng),既要滿足實時傳播的需要,又要建立在高可靠性的數(shù)據(jù)基礎之上。
2? ?系統(tǒng)框架(System framework)
2.1? ?相關技術介紹
本文采用MEAN框架進行系統(tǒng)開發(fā)。MEAN框架是一個JavaScript平臺下現(xiàn)代Web開發(fā)框架的總稱,是MongoDB、Express、Angular、Node.js四個框架的第一個字母組合的簡稱。Node.js是一個基于Chrome JavaScript運行時建立的平臺,用于搭建響應速度快、易于擴展的網(wǎng)絡應用[3]。Node.js本身的特點非常適合在分布式設備上運行數(shù)據(jù)密集型的實時應用。它采用一系列“非阻塞”I/O模型庫來支持事件循環(huán)方式,為文件系統(tǒng)、數(shù)據(jù)庫等資源提供接口,通過異步的方式實現(xiàn)數(shù)據(jù)的非阻塞傳輸。Express是一款基于Node.js的Web應用開發(fā)框架。Express雖然規(guī)模小巧,卻為Web和移動應用程序提供一組強大的功能。Angular是由Google公司開發(fā)和維護前端的應用框架,其核心特點包括MVVM、模塊化、自動化雙向數(shù)據(jù)綁定、語義化標簽、依賴注入等。MongoDB是NoSQL的一種,可以方便地存儲復雜的數(shù)據(jù)類型。其由于高性能、易部署、易使用,以及存儲數(shù)據(jù)方便等特點,是目前應用最廣泛的NoSQL數(shù)據(jù)庫。
2.2? ?RESTful接口
在系統(tǒng)設計和實現(xiàn)的過程中,始終以RESTful接口的形式實行數(shù)據(jù)的互聯(lián)共享。無論是現(xiàn)場比分、歷史戰(zhàn)績,還是賽隊或隊員的相關信息都可以通過統(tǒng)一的數(shù)據(jù)接口實現(xiàn)訪問,從而避免了運動項目或賽事因業(yè)務與功能的不同,建立數(shù)據(jù)彼此獨立、相互封閉信息的“信息孤島”[4];以資源的方式提供數(shù)據(jù)服務可以提高體育信息數(shù)據(jù)的有效集成,擴大媒介的傳播效果[5]。以信息服務為目標,提供體育賽事相關資料的綜合性服務,必將成為大型體育賽事信息服務變革的方式,對于實現(xiàn)信息服務系統(tǒng)化、標準化以及提高信息利用率,具有重要意義[6]。
進行RESTful風格的API設計時,需要客戶端和服務器之間的交互在請求之間是無狀態(tài)的。所謂無狀態(tài)即所有的資源都是通過URI進行定位的,而且該URI提供的資源與其他資源無關,也不會因為其他資源的變化而改變[7]。例如,查詢某運動員的成績,如果查詢成績時需要登錄成績管理系統(tǒng),進入特定的成績查詢頁面,執(zhí)行相關操作后獲取該名運動員的歷史成績,上述情況則屬于有狀態(tài),因為查詢運動員歷史成績的每一步操作都依賴于前一步操作的結果,只要前置操作失敗,則后續(xù)操作就無法執(zhí)行。如果在瀏覽器地址欄中輸入一個URL地址即可返回某運動員的歷史成績,則該情況屬于無狀態(tài),因為獲取運動員成績資源不依賴于其他資源或狀態(tài),而是與一個URL地址相對應,可以通過HTTP的GET方法得到該資源。
3? ?數(shù)據(jù)存儲方案設計(Design of data storage)
高質量的數(shù)據(jù)信息服務,除了追求數(shù)據(jù)在分享方面的高效之外,對數(shù)據(jù)的準確性也有相當高的要求。不以數(shù)據(jù)質量為前提的數(shù)據(jù)服務,其后果必然是災難性的。因此,系統(tǒng)的數(shù)據(jù)存儲方案就顯得格外重要,既要保證數(shù)據(jù)便于分享,也要保證數(shù)據(jù)準確。如果僅僅采用單一性的數(shù)據(jù)庫將很難滿足需求。
系統(tǒng)存儲方案采用的是本地與云端同步存儲的模式,如圖1所示。系統(tǒng)前端通過AJAX發(fā)送數(shù)據(jù)到云數(shù)據(jù)庫,并通過云數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)的實時分享,但由于不可預測的網(wǎng)絡原因,存儲過程有可能會出現(xiàn)長時間延遲,甚至失敗。而競技體育賽事往往無法重賽,如果出現(xiàn)數(shù)據(jù)丟失的情況將是非常嚴重的事故。這不僅無法滿足數(shù)據(jù)分享的需求,更有可能因為競賽數(shù)據(jù)的丟失導致賽事無法正常進行。本地存儲由于沒有網(wǎng)絡依賴,能保證數(shù)據(jù)的完整性和準確性。系統(tǒng)通過同時向本地和云端存儲數(shù)據(jù),確保競賽數(shù)據(jù)不會丟失。同時,將本地數(shù)據(jù)與云數(shù)據(jù)庫進行數(shù)據(jù)一致性校對,避免由于網(wǎng)絡原因造成云端數(shù)據(jù)丟失,確保云端數(shù)據(jù)的完整性。用戶通過向云數(shù)據(jù)庫發(fā)送請求,獲取準確的競賽實時數(shù)據(jù)。
在數(shù)據(jù)庫選擇方面,以MySQL為代表的傳統(tǒng)關系型數(shù)據(jù)庫在處理海量數(shù)據(jù)文檔時有其固有的局限性,很難滿足海量數(shù)據(jù)的柔性管理需求[8]。而以MongoDB為代表的NoSQL數(shù)據(jù)庫卻能夠很好地應對非結構化的數(shù)據(jù)存儲,對于表結構需要臨時調整、字段不固定、快速響應海量數(shù)據(jù)寫入等方面都具有相當明顯的優(yōu)勢。同時有研究表明,MongoDB數(shù)據(jù)庫與MySQL數(shù)據(jù)庫相比,多線程、高并發(fā)情況下的數(shù)據(jù)插入性能明顯高得多[7]。最終,系統(tǒng)服務器端選擇以MongoDB為存儲數(shù)據(jù)庫。
本地存儲的選擇,同樣將MongoDB作為主要的候選對象,同時,由于整個競賽系統(tǒng)只需要存儲與比賽相關的數(shù)據(jù)信息,而運動員信息、賽隊信息、往期賽事成績等相關數(shù)據(jù)無須進行存儲,數(shù)據(jù)量并不大。在確認云端數(shù)據(jù)完整無誤之后,本地數(shù)據(jù)可以刪除。所以,HTML5 Local Storage也可作為候選對象。
4? 存儲性能優(yōu)化(Storage performance optimization)
在明確存儲方案之后,為進一步優(yōu)化該方案,在系統(tǒng)設計過程中,對本地各存儲備選方案進行了性能測試,以選出最優(yōu)本地存儲方案。
4.1? ?測試環(huán)境
測試環(huán)境使用的是Intel Core i7 2.5 GHz CPU,16 GB
內存、AMD Radeon R9 M370X 2048 MB顯存的GPU,操作系統(tǒng)為macOS Sierra 10.12.1,測試用的瀏覽器分別是Safari、Chrome和Opera。由于在macOS中不支持Windows操作系統(tǒng)下常用的IE瀏覽器,因此沒有在IE瀏覽器中進行測試。
4.2? ?測試方法
分別調用HTML5原生Local Storage方法、自定義基于Angular Service規(guī)范的HTML5 Local Storage方法(以下簡稱Angular Local Storage Service),以及本地MongoDB Service方法,比較它們在相同存儲次數(shù)下所消耗的時間。存儲的對象是一個不斷增加的MongoDB ObjectId對象數(shù)組。設置這樣的存儲測試方法,一方面是因為摩托艇這類環(huán)圈競速賽比賽規(guī)則的原因;另一方面這也是NoSQL數(shù)據(jù)庫的優(yōu)勢所在,無須像SQL數(shù)據(jù)庫一樣,每條數(shù)據(jù)順序插入數(shù)據(jù)庫中,而只需要修改文檔數(shù)據(jù)庫的字段內容即可。同時,該數(shù)據(jù)結構也更有利于進行與云端的數(shù)據(jù)一致性校驗。
測試的存儲次數(shù)分別為100、1,000、2,000、3,000、4,000和5,000,最終判斷Safari、Chrome和Opera三款瀏覽器的性能優(yōu)劣。由于在真實比賽過程中,系統(tǒng)存儲數(shù)據(jù)I/O的頻次遠低于實驗設計,同時實驗的主要目的是為了找出在較低頻次下,各個儲存方案的性能差異,因此本次實驗的最大測試次數(shù)設置為5,000,沒有繼續(xù)增大循環(huán)測試次數(shù)。
實際測試過程中,通過在循環(huán)開始前后分別調用Date.now()方法獲取系統(tǒng)時間,通過比較兩次系統(tǒng)時間的時間差來確定循環(huán)運行所消耗的時間。以HTML5 Local Storage測試的實驗代碼為例:
saveByLocalStorage(data){
let tempArray = [];
let tempObject = {};
let startTime = Date.now();
for(let i=0;i tempArray.push(data); tempObject['result'] = tempArray; localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(tempObject)); } let endTime = Date.now(); console.log("LocalStorage Testing Duration Time :" + (endTime - startTime));} Angular的結構框架不推薦直接使用組件獲取或者保存數(shù)據(jù),雖然直接調用HTML5 Local Storage方法可以實現(xiàn)數(shù)據(jù)的存儲和讀取,但是與Angular的理念不一致。因此在開發(fā)的過程中獨立編寫了一個基于HTML5 Local Storage的Service,再通過Angular的依賴注入機制應用于系統(tǒng)之中。 class LocalStorageService { constructor(storage) { this.storage = storage; } get(key) { try { return JSON.parse(this.storage.getItem(key)); } catch (error) { return null; } } set(key, value) { this.storage.setItem(key, JSON.stringify (value));} remove(key) { this.storage.removeItem(key); } } 保存到本地MongoDB數(shù)據(jù)庫時,利用Angular的Observable對象,借助RxJS庫對數(shù)據(jù)流進行異步處理,在Angular中幾乎都使用該方法來處理AJAX請求和響應。在Angular前端設置比賽成績的Service的數(shù)據(jù)服務之前,需要在服務器端創(chuàng)建RESTful風格的數(shù)據(jù)接口用以滿足前端的需要。由于是以競賽成績?yōu)闇y試內容,而競賽成績本身屬于敏感信息,不能允許任意用戶進行隨意的創(chuàng)建、修改和刪除,因此在接口設計時除GET方法外,其他所有方法都進行了權限管理,必須管理員用戶才可以訪問這些接口。 5? ?實驗結果(Experimental results) 在實際測試中,分別在Safari、Chrome和Opera三款瀏覽器運行測試程序,所有測試結果均在console面板中顯示。從測試結果來看,Safari、Chrome和Opera三款瀏覽器在HTML5 Local Storage、Angular Local Storage Service和本地MongoDB Service這三項測試中,所表現(xiàn)出的性能沒有顯著差異。這三款瀏覽器在HTML5 Local Storage和Angular Local Storage Service的測試對比中,均表現(xiàn)出用Angular Service標準寫出的方法比直接調用HTML5 Local Storage有5%左右的性能優(yōu)勢。用Angular Service標準編寫的服務本身調用的就是HTML5 Local Storage,雖然只是用Angular Service的規(guī)范將HTML5 Local Storage進行封裝,但Angular Service服務由于在構建Component時已經加載成功,因此會表現(xiàn)出5%左右的性能優(yōu)勢。 而無論是HTML5 Local Storage還是Angular Local Storage Service,在測試次數(shù)在3,000以下時,與本地MongoDB Service都存在著數(shù)量級上的優(yōu)勢。隨著測試次數(shù)增多,它們之間的差異雖然縮小,性能差距依然在三倍以上。 具體測試結果如表1—表3所示。 從整體的測試結果來看,使用Local Storage的存儲方案明顯會更加具有優(yōu)勢。Angular Local Storage Service的方法雖然在開發(fā)過程中比直接調用HTML5 Local Storage要復雜一些,但是其兼顧Angular Service的模式,同時還具備5%左右的性能優(yōu)勢,所以在最終開發(fā)過程中選用的是Angular Local Storage Service的開發(fā)方式。 6? ?結論(Conclusion) 對于追求時效性的B/S架構系統(tǒng)來說,以RESTful風格進行API設計將極大地方便數(shù)據(jù)分享和協(xié)同開發(fā)的效率,降低開發(fā)過程中出錯的概率。同時,將所有的數(shù)據(jù)以資源的形式為外界提供服務時,將最大程度消除信息化障礙,確保所有人能夠暢通地獲取體育服務信息。 數(shù)據(jù)存儲方案采用本地與云端同步存儲的模式設計與開發(fā),提高了系統(tǒng)的容錯率,增加了數(shù)據(jù)的可靠性。在本地存儲方案選擇方面,采用Web瀏覽器提供的Local Storage足以滿足臨時性的需求,且性能與本地MongoDB數(shù)據(jù)庫相比,在低頻次的使用時具有數(shù)量級上的優(yōu)勢,可優(yōu)先考慮以HTML5 Local Storage作為臨時存儲數(shù)據(jù)庫對象。在以Angular為前端開發(fā)框架時,基于Angular標準的service存儲性能比直接調用HTML5 Local Storage具有5%左右的性能優(yōu)勢,可優(yōu)先考慮。 參考文獻(References) [1] 杜岳峰,申德榮,聶鐵錚.基于關聯(lián)數(shù)據(jù)的一致性和時效性清洗方法[J].計算機學報,2017,40(1):92-105. [2] 冉榮.自媒體背景下體育微博的發(fā)展及價值[J].新媒在線,2017(11):147-148. [3] 王伶俐.基于NodeJS + Express框架的輕應用定制平臺的設計與實現(xiàn)[J].計算機科學,2017(11):596-599. [4] 王家宏,孫晉海,伊超.基于數(shù)據(jù)集成的水上項目國家隊數(shù)據(jù)庫網(wǎng)絡管理平臺的設計與開發(fā)[J].山東體育學院學報,2015(1):1-7. [5] 林寧波.大數(shù)據(jù)時代體育信息傳播改革路徑[J].大統(tǒng)計,2018(3):31-33. [6] 王廣田,張文蓮.大型體育賽事檔案信息服務的困境與變革[J].山西檔案,2018(7):130-132. [7] Haviv, Amos Q. MEAN Web Development: Master real-time web application development using a mean combination of MongoDB, Express, Angular JS, and Node.js[M]. Birmingham, UK: Packet Publishing, 2014:2-8. [8] 胡小春,李陶深,王樂.基于NoSQL的大數(shù)據(jù)應用設計與性能保障方案研究[J].廣西大學學報(自然科學版),2014(6):633-640. 作者簡介: 石? ?清(1981-),男,碩士,講師.研究領域:體育信息技術,人機工程學.