廖 佳,陳 揚,包秋蘭,廖雪花,朱洲森*
(1.四川師范大學(xué)物理與電子工程學(xué)院,成都 610101;2.四川師范大學(xué)計算機科學(xué)學(xué)院,成都 610101)
(*通信作者電子郵箱992827658@qq.com)
隨著社會的數(shù)字化轉(zhuǎn)型、互聯(lián)網(wǎng)的蓬勃發(fā)展以及國民經(jīng)濟的快速崛起,世界各個領(lǐng)域的數(shù)據(jù)呈爆炸式增長,大流量數(shù)據(jù)的處理問題引起了世界各國專家的廣泛關(guān)注[1-2]。數(shù)據(jù)作為信息的載體,已經(jīng)成為包括互聯(lián)網(wǎng)經(jīng)濟、交通物流和社會生活等各個領(lǐng)域中最核心的資源[3]。在這些領(lǐng)域中,高效的計算能力是必不可少的條件之一。
我國在大數(shù)據(jù)計算應(yīng)用領(lǐng)域發(fā)展迅速,主要集中在I/O密集型[4]和計算密集型[5]。目前I/O 密集型數(shù)據(jù)處理在我國應(yīng)用領(lǐng)域先進而成熟,典型應(yīng)用場景如春運期間搶購火車票、購物網(wǎng)站的“雙十一”搶購商品、電商平臺的秒殺搶購等。對于這些I/O 密集型應(yīng)用,通過技術(shù)的不斷革新和架構(gòu)的不斷優(yōu)化,得到了進一步的提升和完善。但是計算密集型數(shù)據(jù)處理仍然處在發(fā)展階段,對于大型應(yīng)用的開發(fā)存在困難,主要集中在大型科學(xué)計算、省市級的社保醫(yī)保數(shù)據(jù)的計算與服務(wù)、稅務(wù)數(shù)據(jù)的計算與優(yōu)化等方面。
對于計算密集型的應(yīng)用,國內(nèi)外學(xué)者在任務(wù)調(diào)度、資源分配等方面有一些相關(guān)研究。張楠等[6]提出了一種面向計算密集型任務(wù)的分布式任務(wù)調(diào)度平臺,有效地提高了系統(tǒng)的資源利用率和穩(wěn)定性。楊志豪等[7]研究了一種面向數(shù)據(jù)和計算雙重密集型任務(wù)的私有云計算系統(tǒng)實現(xiàn)方案,通過對文件和并行處理模塊的簡化和優(yōu)化,使得系統(tǒng)結(jié)構(gòu)變得簡單且方便使用。郝永生等[8]分析研究了計算密集型和數(shù)據(jù)密集型混合作業(yè)情況下的調(diào)度問題,對傳統(tǒng)的網(wǎng)格作業(yè)調(diào)度算法進行了擴展,提出了三種調(diào)度算法:Emin-min、Ebest、Esufferage。Kolici等[9]從高計算需求的角度出發(fā),介紹了利用現(xiàn)代高性能體系結(jié)構(gòu)模擬調(diào)度和資源分配的計算密集型應(yīng)用的一些研究成果。
對于計算密集型的應(yīng)用,在我國目前還處于發(fā)展階段。因此,本文提出一套計算密集型大流量數(shù)據(jù)的接力計算與動態(tài)分流處理模型。通過內(nèi)存型數(shù)據(jù)存儲模塊中預(yù)存儲信息確定計算任務(wù)的復(fù)雜等級,同時利用接力計算模塊中計算節(jié)點的資源能力作為排序標準,將計算任務(wù)動態(tài)分配至指定接力計算節(jié)點并行處理,最終在數(shù)據(jù)分流模塊整合計算結(jié)果,返回客戶端展示,有效減輕了單服務(wù)器端的計算壓力。
本文主要工作:1)采用內(nèi)存型數(shù)據(jù)庫預(yù)存計算參量,減少數(shù)據(jù)庫對頻繁使用參量的讀寫成本,同時內(nèi)存數(shù)據(jù)庫動態(tài)記錄計算量與復(fù)雜度,供動態(tài)計算調(diào)節(jié)器使用;2)調(diào)節(jié)器動態(tài)調(diào)用數(shù)據(jù)存儲資源(分布式數(shù)據(jù)庫),將大流量的計算任務(wù)拆解為若干小任務(wù)由存儲資源并行運算,并將并行運算的初步結(jié)果送往下一級處理層;3)后續(xù)兩級到三級的接力處理層將復(fù)雜的計算任務(wù)并行地分層處理,將最后的計算結(jié)果以數(shù)據(jù)流的方式合并輸出。
微服務(wù)架構(gòu)[10]是一種體系結(jié)構(gòu)模式,它采用一組服務(wù)來構(gòu)建一個應(yīng)用程序,服務(wù)獨立地部署在不同的進程中,可獨立擴展伸縮,并且每個服務(wù)可采用不同的編程語言來實現(xiàn)。相較于傳統(tǒng)的單體應(yīng)用架構(gòu),微服務(wù)架構(gòu)具有以下優(yōu)勢:
①獨立部署。
由于微服務(wù)具有獨立的運行進程,所以每個微服務(wù)可以獨立進行部署。當某個微服務(wù)發(fā)生變化時,不需要重新編譯和部署整個應(yīng)用程序,大大縮短了應(yīng)用的交付周期。
②降低復(fù)雜度。
微服務(wù)架構(gòu)將單個模塊應(yīng)用程序分解為多個微服務(wù),同時保持總體功能不變。每個服務(wù)都集中在一個單一的功能上,并通過接口清楚地表示服務(wù)邊界。由于功能單一、復(fù)雜度低,小規(guī)模開發(fā)團隊可以充分掌握,易于維護,開發(fā)效率高。
③技術(shù)選型多元化。
在微服務(wù)架構(gòu)下,應(yīng)用程序的技術(shù)選擇是去中心化的,各個開發(fā)團隊可以根據(jù)自身應(yīng)用的業(yè)務(wù)需求開發(fā),選擇合適的架構(gòu)和技術(shù)。
④容錯性。
在微服務(wù)架構(gòu)中,由于微服務(wù)之間彼此獨立的特點,故障被隔離在單個服務(wù)中,系統(tǒng)的其他微服務(wù)模塊可以通過重試、降級等機制在應(yīng)用層實現(xiàn)容錯,從而提高系統(tǒng)應(yīng)用的容錯性。
⑤可擴展性。
微服務(wù)架構(gòu)中的每一個服務(wù)可以根據(jù)實際需要獨立地進行擴展[11],充分體現(xiàn)了微服務(wù)架構(gòu)的靈活性。
本文采用微服務(wù)架構(gòu)搭建接力計算與動態(tài)分流處理模型。
WebClient 是一個非阻塞、響應(yīng)式的HTTP(HyperText Transfer Protocol)客戶端工具,它以響應(yīng)式流、背壓的方式執(zhí)行HTTP 請求。對于高并發(fā)的情況,可以利用非阻塞和響應(yīng)式的特性使用少量的線程數(shù)進行處理[12]。本文利用這兩個特性處理微服務(wù)各模塊之間通信的問題。
采用微服務(wù)架構(gòu)搭建整體框架,各個微服務(wù)模塊之間如何遠程進行訪問服務(wù)資源是需要考慮的問題。目前,一般微服務(wù)中各個模塊之間的調(diào)用有兩種方式:RestTemplate 和Feign,都是采用HTTP 協(xié)議調(diào)取Restful API 的方式。但這兩種方式都具有阻塞的缺點,當系統(tǒng)應(yīng)用收到大量請求時,會造成請求堆積,響應(yīng)時長增加。非阻塞客戶端WebClient 的出現(xiàn),可以完美解決上述問題。
本文在接力計算和數(shù)據(jù)同步過程中,各層接力計算節(jié)點利用WebClient 的非阻塞特性進行通信,傳遞計算和同步任務(wù),獲取處理結(jié)果。接力計算節(jié)點調(diào)用圖如圖1所示。
為解決現(xiàn)有大流量數(shù)據(jù)計算緩慢、響應(yīng)時間長等問題,本文研究了一種計算密集型大流量數(shù)據(jù)的接力計算與動態(tài)分流處理模型,具有響應(yīng)迅速、計算效率高、可擴展性好等優(yōu)點。整個模型主要由數(shù)據(jù)分流模塊、內(nèi)存型數(shù)據(jù)存儲模塊、接力計算模塊和數(shù)據(jù)存儲模塊四部分組成,模型圖如圖2所示。
圖2 計算密集型大流量數(shù)據(jù)處理模型Fig.2 Computing-intensive large flow data processing model
由圖2 可知,接力計算與動態(tài)分流處理模型通過四大模塊之間的相互配合,共同完成大流量數(shù)據(jù)的快速計算。該模型的具體運行流程與各大模塊的功能如下:
1)數(shù)據(jù)分流模塊實現(xiàn)大流量數(shù)據(jù)的動態(tài)分流與合并。
該模塊主要利用均衡算法將大流量數(shù)據(jù)均分至多個計算節(jié)點同時進行計算,計算完成后,將結(jié)果進行整合,返回至客戶端進行展示。
2)接力計算模塊完成大部分計算任務(wù)。
接力計算模塊根據(jù)計算任務(wù)的分解方式,確定接力層數(shù)以及各層的節(jié)點數(shù),通過各層各節(jié)點之間相互配合,完成大部分的計算任務(wù)。
3)內(nèi)存型數(shù)據(jù)存儲模塊:微計算處理單元。
內(nèi)存型數(shù)據(jù)存儲模塊具有讀寫速度快、性能好、易于擴展等優(yōu)點[13],本文將具有使用頻率較高、相對固定不變、已進行簡單計算等特點的數(shù)據(jù)預(yù)存儲在內(nèi)存型數(shù)據(jù)存儲模塊中,方便其余三大模塊在計算過程中快速讀取所需數(shù)據(jù)。
4)數(shù)據(jù)存儲模塊:讀寫分離。
數(shù)據(jù)存儲模塊是克隆數(shù)據(jù)存儲集群,采用讀寫分離,能有效減輕數(shù)據(jù)存儲模塊的負載壓力[14]。其中,讀取數(shù)據(jù)集中在(N-1)個數(shù)據(jù)存儲端,而寫入數(shù)據(jù)在N個數(shù)據(jù)存儲端中并行執(zhí)行。當寫入數(shù)據(jù)出現(xiàn)錯誤時,進行回滾,保證存儲端集群中的數(shù)據(jù)一致。
傳統(tǒng)的大流量計算模式多為增加或升級硬件資源,譬如大型互聯(lián)網(wǎng)企業(yè)雙十一期間需要增加幾千或上萬臺服務(wù)器,或人為拆解大流量為若干小任務(wù),需要較長的時間完成大量的計算任務(wù)。
相較于傳統(tǒng)大流量數(shù)據(jù)的計算方式,本文所提出的接力計算與動態(tài)分流處理模型有以下優(yōu)勢:
1)緩解硬件資源節(jié)點的計算壓力。數(shù)據(jù)分流模塊通過內(nèi)存型存儲模塊中的數(shù)據(jù)快速確定計算任務(wù)的復(fù)雜等級X,利用均衡算法將計算任務(wù)分配至X個接力計算節(jié)點完成,有效緩解單一架構(gòu)的計算壓力。
2)易于擴展。本文的接力計算模塊為集群式,體現(xiàn)為多層接力節(jié)點共同參與任務(wù)計算。上層接力節(jié)點的計算結(jié)果傳遞到下層接力節(jié)點繼續(xù)參與計算。大流量數(shù)據(jù)的復(fù)雜運算可以利用多層接力節(jié)點異步處理計算任務(wù),減輕傳統(tǒng)單服務(wù)器端的計算壓力。
3)數(shù)據(jù)同步。數(shù)據(jù)存儲端集群采用讀寫分離的方式存儲數(shù)據(jù),有效減輕存儲模塊的負載壓力;并且,通過執(zhí)行SQL 捕獲器的結(jié)果和引發(fā)錯誤后回滾的方式保證數(shù)據(jù)同步。
4)讀寫快速。利用內(nèi)存型數(shù)據(jù)存儲模塊中讀寫數(shù)據(jù)快速的優(yōu)點,將使用頻率較高的數(shù)據(jù)預(yù)存儲在內(nèi)存型數(shù)據(jù)存儲端中。
根據(jù)接力計算與動態(tài)分流處理模型的說明,可以得到接力計算與動態(tài)分流處理模型的總體運行流程如圖3所示。
圖3 接力計算與動態(tài)分流處理模型流程Fig.3 Flowchart of relay computation and dynamic diversion processing model
具體技術(shù)實現(xiàn)闡述如下:
1)數(shù)據(jù)分流模塊對數(shù)據(jù)進行動態(tài)分流。
數(shù)據(jù)分流模塊接收客戶端原始任務(wù)請求,利用SQL 捕獲器的結(jié)果判斷任務(wù)類型。其中,增加、刪除和更新操作屬于數(shù)據(jù)同步任務(wù),而讀取操作屬于計算任務(wù)。
SQL 捕獲器的結(jié)果判定是計算任務(wù)時,先確定計算任務(wù)的復(fù)雜等級。本文將第一次請求數(shù)據(jù)的時間Tm預(yù)存儲在內(nèi)存型數(shù)據(jù)存儲模塊中,后續(xù)計算請求任務(wù)將Tm與自定義閾值時間T作對比,得到計算任務(wù)的復(fù)雜等級X:
其中:N為數(shù)據(jù)存儲端的個數(shù);Tm表示第一次請求數(shù)據(jù)時間;T表示自定義閾值時間;X表示參與計算節(jié)點數(shù)和計算任務(wù)的復(fù)雜等級;[]表示取整。
當Tm/T≤1 時,表示接力計算模塊中的1 個接力計算節(jié)點得到全部計算任務(wù)Y。當Tm/T∈(1,N-2]時,使用式(2)計算每個接力計算節(jié)點獲取的計算任務(wù)量R:
其中:n代表計算節(jié)點的編號;Y表示計算任務(wù)量。
當Tm/T>N-2,并且Y%X=0 時,使用式(3)計算每個接力計算節(jié)點獲取的計算任務(wù)量R:
當Tm/T>N-2,并且Y%X≠0 時,使用式(4)計算每個接力計算節(jié)點獲取的計算任務(wù)量R:
接力計算節(jié)點完成計算任務(wù)的分配時,需要先對接力計算節(jié)點進行編號。利用微服務(wù)架構(gòu)中的服務(wù)發(fā)現(xiàn)功能獲取第一層接力計算節(jié)點所在服務(wù)器端的IP 地址,通過IP 地址讀取CPU 和內(nèi)存使用率等信息,對節(jié)點資源能力按照從低到高進行排序,對各個節(jié)點進行編號(編號值n:1 →N-1)。每個接力計算節(jié)點分配的計算任務(wù)量R由式(2)~(4)可得。
SQL 捕獲器結(jié)果判斷是數(shù)據(jù)同步任務(wù)時,將SQL 捕獲器結(jié)果和任務(wù)標識作為請求參數(shù),直接轉(zhuǎn)發(fā)到接力計算模塊進一步處理。
2)數(shù)據(jù)存儲模塊實現(xiàn)數(shù)據(jù)提取、簡單運算和數(shù)據(jù)同步的功能。
數(shù)據(jù)存儲模塊根據(jù)任務(wù)標識執(zhí)行不同的任務(wù),分別為計算任務(wù)和數(shù)據(jù)同步任務(wù),以下將分為兩方面進行介紹。
①計算任務(wù)。
數(shù)據(jù)存儲模塊執(zhí)行計算任務(wù)時,將數(shù)據(jù)提取和簡單運算放在該模塊完成,例如查詢計算人員的姓名、年齡等基本信息,可以從數(shù)據(jù)存儲模塊提取多位人員姓名、出生日期基本信息,通過編寫的數(shù)據(jù)庫函數(shù)實時計算年齡等信息。而在X個數(shù)據(jù)存儲端完成計算任務(wù)時,先判斷內(nèi)存型數(shù)據(jù)存儲模塊是否存有當前所需數(shù)據(jù),如果未保存,將數(shù)據(jù)寫入內(nèi)存型數(shù)據(jù)存儲模塊,方便后續(xù)請求從內(nèi)存型數(shù)據(jù)存儲模塊中直接提取。計算完成后將半成品結(jié)果返回至接力計算模塊進一步處理。
②數(shù)據(jù)同步任務(wù)。
數(shù)據(jù)存儲模塊執(zhí)行數(shù)據(jù)同步任務(wù)時,N個數(shù)據(jù)存儲端執(zhí)行SQL 捕獲器的結(jié)果(增加、刪除和更新),N個接力計算節(jié)點記錄執(zhí)行情況并使用WebClient 相互通信。如果當前數(shù)據(jù)存儲端執(zhí)行成功,同時收到其余(N-1)個數(shù)據(jù)存儲端執(zhí)行成功的信息,接力計算節(jié)點向上一層接力處理模塊返回執(zhí)行成功的信息。
如果N個數(shù)據(jù)存儲端中出現(xiàn)執(zhí)行失敗的情況,出錯的接力計算節(jié)點使用WebClient向其余節(jié)點發(fā)送執(zhí)行失敗的信息,利用數(shù)據(jù)庫ACID 特性[15]的原子性(ACID特性即原子性Atomic、一致性Consistency、隔離性Isolation和持久性Durability),對執(zhí)行成功的模塊進行事務(wù)回滾,恢復(fù)至執(zhí)行前的數(shù)據(jù)狀態(tài),同時接力計算節(jié)點向上一層計算終端返回執(zhí)行失敗的信息,這樣可以保證N個數(shù)據(jù)存儲端中的數(shù)據(jù)完全相同。數(shù)據(jù)存儲模塊功能流程如圖4所示。
圖4 數(shù)據(jù)存儲模塊功能流程Fig.4 Function flowchart of data storage module
3)接力計算模塊完成數(shù)據(jù)的大部分計算。
接力計算模塊主要完成大部分的計算任務(wù),可以自定義接力計算層數(shù)F,其中每層接力節(jié)點數(shù)m需要大于等于數(shù)據(jù)存儲端數(shù)量N。
本文在確定最佳接力計算層數(shù)F時,需要對復(fù)雜計算任務(wù)完成分解。任務(wù)分解的思想在于將一個復(fù)雜計算任務(wù)通過某種方式分解為多個不同的、簡單的子任務(wù),可以將這些分解后的子任務(wù)交給多個接力計算模塊完成,最終將多個模塊計算完成的結(jié)果返回數(shù)據(jù)分流模塊,進行整合規(guī)范。
本文在完成計算任務(wù)分解時,需先測量單機完成該任務(wù)所花費的時長。接著,將任務(wù)分解為多個無關(guān)聯(lián)的計算子任務(wù),分配至多層接力計算節(jié)點完成,記錄任務(wù)完成時間。同時,考慮各模塊的關(guān)聯(lián)和依賴作用,將多個計算子任務(wù)合并在同一個接力節(jié)點完成,記錄最終任務(wù)的完成時間。比較多種任務(wù)分解方式,得出最合理的任務(wù)分解方式,計算完成所花費的時間最短。
本文使用3層接力節(jié)點,每層接力節(jié)點包含3個接力計算節(jié)點,3 個數(shù)據(jù)存儲端為例進行具體詳述。接力計算模塊結(jié)構(gòu)如圖5所示。
圖5 接力計算模塊結(jié)構(gòu)圖Fig.5 Structure diagram of relay computation module
數(shù)據(jù)分流模塊對數(shù)據(jù)進行分流,根據(jù)式(1)確定復(fù)雜等級X的值,比如計算完成X的值為2,代表將計算任務(wù)分配至兩個接力計算節(jié)點同時完成。將計算任務(wù)量劃分成2 份,對第一層接力節(jié)點中3 個計算節(jié)點資源能力從高到低進行排序編號,將計算任務(wù)分配至編號1 和2 的接力計算節(jié)點完成,根據(jù)式(3)或式(4)得到每個接力計算節(jié)點分配的計算任務(wù)量R。節(jié)點資源能力計算公式如下:
其中:NodeAbility代表計算節(jié)點的資源能力;Rate代表CPU 剩余利用率;idle_cores代表空閑CPU 核數(shù);MainFrequency代表CPU主頻。
處理數(shù)據(jù)完成后,對第二層接力計算節(jié)點資源能力按照式(5)計算后進行排序編號,轉(zhuǎn)發(fā)對應(yīng)編號節(jié)點的計算任務(wù)請求,比如第一層接力節(jié)點編號為1 的計算節(jié)點向第二層接力節(jié)點中編號為1 的計算節(jié)點轉(zhuǎn)發(fā)請求,以此類推,第二層接力節(jié)點向第三層節(jié)點請求轉(zhuǎn)發(fā)的規(guī)則也相同。節(jié)點計算結(jié)構(gòu)如圖6所示。
圖6 節(jié)點計算結(jié)構(gòu)圖Fig.6 Node computation structure diagram
如上所述,請求到達第三層接力節(jié)點時,數(shù)據(jù)提取和簡單運算放在數(shù)據(jù)存儲模塊完成,每個接力計算節(jié)點對應(yīng)一個數(shù)據(jù)存儲端,在計算過程中可以直接獲取內(nèi)存型數(shù)據(jù)存儲模塊中所需數(shù)據(jù),計算完成的半成品結(jié)果在第三層、第二層和第一層接力節(jié)點中特制的計算模塊進行進一步處理。第一層接力節(jié)點得到最終計算結(jié)果后,返回到數(shù)據(jù)分流模塊,進行合并2個接力節(jié)點的計算結(jié)果,轉(zhuǎn)換為客戶端能夠解析的數(shù)據(jù)類型,將整合規(guī)范后的結(jié)果返回客戶端展示。接力計算模塊中的各層節(jié)點之間的通信采用異步非阻塞的WebClient方式,不會阻塞后續(xù)程序運行。
接力計算模塊處理數(shù)據(jù)同步任務(wù)時,計算結(jié)構(gòu)圖和處理計算任務(wù)時相同,如圖6所示。
數(shù)據(jù)分流模塊將SQL捕獲器的結(jié)果和數(shù)據(jù)同步任務(wù)標識作為請求參數(shù),轉(zhuǎn)發(fā)至第一層接力節(jié)點中資源能力按照式(5)計算后進行排序編號為1 的計算節(jié)點,在解析請求參數(shù)中任務(wù)標識為數(shù)據(jù)同步任務(wù)時,將請求直接轉(zhuǎn)發(fā)至第二層接力節(jié)點中資源能力也按照式(5)計算后進行排序編號為1 的計算節(jié)點,該節(jié)點接收請求后,轉(zhuǎn)發(fā)至第三層中所有計算節(jié)點,在數(shù)據(jù)存儲模塊中并行執(zhí)行SQL 捕獲器結(jié)果。如前面所述,出現(xiàn)執(zhí)行失敗的情況時,3 個接力計算節(jié)點使用WebClient 相互通信,數(shù)據(jù)存儲模塊進行事務(wù)回滾,恢復(fù)至未執(zhí)行前的數(shù)據(jù)狀態(tài)。3 個接力計算節(jié)點將執(zhí)行失敗情況原路返回,在數(shù)據(jù)分流模塊對執(zhí)行情況進行整合,最終將任務(wù)完成情況返回給客戶端。數(shù)據(jù)同步失敗結(jié)構(gòu)如圖7所示。
圖7 數(shù)據(jù)同步失敗結(jié)構(gòu)圖Fig.7 Data synchronization failure structure diagram
本文通過計算保存在數(shù)據(jù)存儲模塊中的學(xué)生成績數(shù)據(jù),獲取指定數(shù)據(jù)量的計算任務(wù),完成對應(yīng)學(xué)生總分、平均分等計算。將第一次多個計算節(jié)點請求數(shù)據(jù)的響應(yīng)時間小于單個計算節(jié)點時的數(shù)據(jù)量預(yù)存儲在內(nèi)存型數(shù)據(jù)存儲模塊,后續(xù)請求數(shù)據(jù)量與內(nèi)存型數(shù)據(jù)存儲模塊中作對比:如果超過該數(shù)據(jù)量,對數(shù)據(jù)進行分流;如果未超過該數(shù)據(jù)量,由單個計算節(jié)點完成,利用當前節(jié)點的資源能力判斷任務(wù)分配至各層節(jié)點計算。
本文測試計算中,主要使用單個計算節(jié)點和兩個計算節(jié)點(2 層接力節(jié)點,每層接力節(jié)點包含2 個接力計算節(jié)點和2個數(shù)據(jù)存儲端)進行測試。模擬接力計算時,為簡單處理只將提取學(xué)生成績放在數(shù)據(jù)存儲端完成,平均分放在第一層節(jié)點,總分放在第二層節(jié)點計算。
客戶端將計算任務(wù)分配至數(shù)據(jù)分流模塊,通過內(nèi)存型數(shù)據(jù)存儲模塊中的數(shù)據(jù)判斷是否進行分流,將分流請求數(shù)據(jù)量傳送至第二層計算節(jié)點,提取學(xué)生多門成績放在數(shù)據(jù)存儲模塊完成,將半成品計算結(jié)果以流的形式返回接力計算模塊,分別計算學(xué)生的總分和平均分。計算完成,將結(jié)果返回數(shù)據(jù)分流模塊進行整合,最終在客戶端展示。每次客戶端發(fā)送計算請求時,記錄每次請求完成的響應(yīng)時間。
需要說明的是,為了測試的真實性,測試在正式的生產(chǎn)環(huán)境進行,所以沒有讓計算進行同步回寫存儲,但不影響對模型與框架的驗證與相應(yīng)結(jié)論。
本文使用的物理環(huán)境包括如下:
數(shù)據(jù)分流模塊運行環(huán)境:1 臺Linux 服務(wù)器,操作系統(tǒng)CentOS-7.6 64 bit,運行內(nèi)存8 GB,帶寬10 Mb/s,Java 開發(fā)工具包jdk-1.8.0_181。
接力計算模塊運行環(huán)境:2 臺Linux 服務(wù)器,操作系統(tǒng)CentOS 7.6 64 bit,運行內(nèi)存8 GB,帶寬5 Mb/s,Java 開發(fā)工具包jdk-1.8.0_181。
數(shù)據(jù)存儲模塊運行環(huán)境:1 臺Linux 服務(wù)器,關(guān)系型數(shù)據(jù)庫管理系統(tǒng)MySQL 8.0.20,操作系統(tǒng)CentOS 7.6 64 bit,運行內(nèi)存16 GB,帶寬5 Mb/s,Java 開發(fā)工具包jdk-1.8.0_181。
4.2.1 運行結(jié)果
通過對不同數(shù)量級數(shù)據(jù)的多次測試,去除波動較大的測試結(jié)果后取平均值。學(xué)生成績在單個節(jié)點和多個節(jié)點的計算完成時間的對比測試結(jié)果如表1所示。
表1 單個節(jié)點與兩個節(jié)點耗時對比Tab.1 Time consumption comparison between single node and two nodes
表2~3 展示的當計算請求數(shù)據(jù)量較大(30 000 條)和較?。?00條)時,數(shù)據(jù)分流模塊接收10次計算請求后,每次單個節(jié)點和多個節(jié)點分別從請求開始到返回計算結(jié)果的完成時間對比。需要注意的是,由于實驗中服務(wù)器存在實時網(wǎng)絡(luò)狀態(tài)不同等原因,每次計算請求的完成時間是不相同的,所以表2~3展示的數(shù)據(jù)中,后續(xù)請求的完成時間可能會小于開始請求的完成時間。
表2 請求數(shù)據(jù)量大(30 000條)時的完成時間對比Tab.2 Comparison of completion time for requests with large amount of data(30 000 items)
表3 請求數(shù)據(jù)量?。?00條)時的完成時間對比Tab.3 Comparison of completion time for requests with small amount of data(100 items)
4.2.2 運行結(jié)果分析
根據(jù)運行的結(jié)果,分析表1~3 可知:在計算請求數(shù)據(jù)量較小的情況下,單個計算節(jié)點完成相同計算任務(wù)的時間會小于多個計算節(jié)點的完成時間;而計算請求數(shù)據(jù)量較大的情況,則剛好相反。這說明該模型的計算調(diào)節(jié)器可以通過判斷請求數(shù)據(jù)量的大小來決定是否進行分流,避免在計算過程中過多資源的浪費。對于大流量數(shù)據(jù)的密集計算使用該模型可以降低運行時間,并且隨著計算請求數(shù)據(jù)量的增大和計算復(fù)雜度的增加,模型的優(yōu)勢就越明顯。并且,該模型通過三層(內(nèi)存型數(shù)據(jù)存儲模塊、接力計算模塊和數(shù)據(jù)存儲模塊)的接力計算,可以解決一般數(shù)據(jù)計算軟件可能出現(xiàn)的運算速度緩慢、計算阻塞堆積等問題,也大幅減少了其中一層的運算和處理接近滿負荷或積壓,而另外兩層出現(xiàn)等待或閑置的狀況。通過不同數(shù)量級計算數(shù)據(jù)的測試,記錄了單個節(jié)點和多個節(jié)點計算完成時間等指標,對指標數(shù)據(jù)的整理分析,說明了該模型能夠顯著提升數(shù)據(jù)計算的效率,對超高并發(fā)數(shù)據(jù)的處理、計算密集性數(shù)據(jù)的計算方法及類似應(yīng)用場景,具有借鑒與參考性的價值。
本文構(gòu)建一種利用內(nèi)存式數(shù)據(jù)存儲技術(shù)為過渡,通過預(yù)存儲、一體化轉(zhuǎn)換、讀寫分離等構(gòu)架與算法,探索快速處理存儲模塊數(shù)據(jù)的模型與構(gòu)架,并著眼于通過內(nèi)存式數(shù)據(jù)存儲技術(shù)為樞紐,將大流量數(shù)據(jù)的計算任務(wù),通過預(yù)加載、解耦、緩存機制等,銜接來自于動態(tài)分流進一步處理的數(shù)據(jù),完成大流量數(shù)據(jù)的快速計算。該模型及其實現(xiàn)已經(jīng)在實際的密集計算型的應(yīng)用場景得到運用,在計算速度和資源成本方面都取得理想的結(jié)果[16]。該方案和相關(guān)技術(shù)對于計算密集型的應(yīng)用領(lǐng)域和相關(guān)研究,都具有建設(shè)性的意義,也可降低信息化系統(tǒng)建設(shè)成本,實現(xiàn)資源充分利用。