摘要:針對(duì)微服務(wù)框架Spring Cloud中內(nèi)置負(fù)載均衡算法不能全面反映負(fù)載與負(fù)載滯后的不足,文章提出一種基于深度學(xué)習(xí)負(fù)載預(yù)測的負(fù)載均衡算法,以更全面的負(fù)載模型衡量微服務(wù)節(jié)點(diǎn)的負(fù)載,并使用GRU神經(jīng)網(wǎng)絡(luò)進(jìn)行負(fù)載預(yù)測,根據(jù)負(fù)載預(yù)測值動(dòng)態(tài)調(diào)整微服務(wù)節(jié)點(diǎn)的權(quán)重,再基于加權(quán)輪詢算法進(jìn)行負(fù)載均衡,進(jìn)一步地提升微服務(wù)應(yīng)用系統(tǒng)的響應(yīng)速度與資源利用率。實(shí)驗(yàn)采用Jmeter進(jìn)行仿真測試,并將本文提出的算法與Spring Cloud的內(nèi)置算法進(jìn)行對(duì)比。實(shí)驗(yàn)結(jié)果表明,在線程并發(fā)數(shù)較多的情況下,該算法能更有效地在使用Spring Cloud搭建的微服務(wù)應(yīng)用系統(tǒng)中實(shí)現(xiàn)負(fù)載均衡。
關(guān)鍵詞:微服務(wù);Spring Cloud;負(fù)載均衡;GRU網(wǎng)絡(luò);負(fù)載預(yù)測
中圖分類號(hào):TP311? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)10-0080-04
隨著互聯(lián)網(wǎng)技術(shù)與云計(jì)算的發(fā)展,單體架構(gòu)已經(jīng)越來越不適應(yīng)于日新月異的應(yīng)用需求。在單體架構(gòu)中,應(yīng)用程序通常被構(gòu)建為一個(gè)不可分割的整體[1],隨著項(xiàng)目的擴(kuò)展,單體架構(gòu)應(yīng)用的開發(fā)、部署、維護(hù)會(huì)越來越困難[2],因此,微服務(wù)架構(gòu)逐漸興起。微服務(wù)架構(gòu)是旨在將軟件系統(tǒng)分解為一組獨(dú)立的微小服務(wù)的云原生架構(gòu)[3],這組微小服務(wù)可以獨(dú)立部署在不同平臺(tái),也可以使用不同的技術(shù)棧。微服務(wù)架構(gòu)可以克服單體架構(gòu)的缺點(diǎn),增強(qiáng)系統(tǒng)的可擴(kuò)展性、高并發(fā)性、高可用性[4],因此被越來越多的企業(yè)與研究機(jī)構(gòu)使用。
在各種微服務(wù)框架中,Spring Cloud是較為流行的一種。據(jù)云原生產(chǎn)業(yè)聯(lián)盟發(fā)布的《中國云原生用戶調(diào)研報(bào)告(2020年) 》[5]顯示,Spring Cloud是微服務(wù)架構(gòu)的用戶首選。由于微服務(wù)架構(gòu)將軟件系統(tǒng)分解為了粒度較小的微服務(wù),故服務(wù)治理技術(shù)也更加復(fù)雜。在服務(wù)治理技術(shù)中,負(fù)載均衡技術(shù)十分關(guān)鍵,通過優(yōu)化微服務(wù)架構(gòu)中的負(fù)載均衡技術(shù)可以有效減少請(qǐng)求延遲,提高微服務(wù)架構(gòu)的可靠性和資源利用率[6]。
Spring Cloud Ribbon是Spring Cloud的負(fù)載均衡組件,其內(nèi)置負(fù)載均衡算法存在負(fù)載衡量不全面與負(fù)載滯后的缺點(diǎn)。如果能較為全面地計(jì)算負(fù)載值,并掌握負(fù)載變化的未來趨勢,對(duì)負(fù)載值進(jìn)行預(yù)測,則能更好地提升負(fù)載均衡算法的性能。本文針對(duì)Spring Cloud Ribbon中存在的問題,提出了一種基于深度學(xué)習(xí)負(fù)載預(yù)測的負(fù)載均衡算法,該算法提出了一種更全面的模型衡量負(fù)載,并對(duì)負(fù)載進(jìn)行預(yù)測,進(jìn)一步提升了微服務(wù)應(yīng)用系統(tǒng)的響應(yīng)速度與資源利用率。
1 負(fù)載預(yù)測
1.1 微服務(wù)節(jié)點(diǎn)負(fù)載模型
微服務(wù)節(jié)點(diǎn)的負(fù)載能反映微服務(wù)節(jié)點(diǎn)的處理性能。選取適當(dāng)?shù)呢?fù)載評(píng)價(jià)指標(biāo)對(duì)負(fù)載進(jìn)行計(jì)算得到綜合負(fù)載值,再基于綜合負(fù)載值進(jìn)行請(qǐng)求分配,可以進(jìn)一步提升負(fù)載均衡算法的準(zhǔn)確性。
本文選取了CPU利用率、內(nèi)存利用率、網(wǎng)絡(luò)利用率、IO利用率四個(gè)負(fù)載評(píng)價(jià)指標(biāo)衡量節(jié)點(diǎn)的動(dòng)態(tài)負(fù)載。由于節(jié)點(diǎn)本身的服務(wù)器配置也會(huì)影響到節(jié)點(diǎn)的性能,并且配置信息一般不會(huì)改變,因此本文將服務(wù)器的配置信息也加入負(fù)載的衡量中。
為了更準(zhǔn)確地表示微服務(wù)節(jié)點(diǎn)的負(fù)載,引入以下定義:
定義1:靜態(tài)性能
微服務(wù)節(jié)點(diǎn)的配置信息可以反映節(jié)點(diǎn)的基礎(chǔ)性能,本文采用的配置信息有CPU核心數(shù)、內(nèi)存容量與網(wǎng)絡(luò)帶寬。節(jié)點(diǎn)[ ? ]的靜態(tài)性能(Static Capacity)記為[SCi],計(jì)算如公式(1) 所示:
通過上述計(jì)算得出本文構(gòu)造的判斷矩陣[A]通過一致性檢驗(yàn),故可將歸一化特征向量作為權(quán)向量。
1.2 GRU神經(jīng)網(wǎng)絡(luò)模型
負(fù)載具有實(shí)時(shí)性,而動(dòng)態(tài)負(fù)載均衡算法中使用的負(fù)載數(shù)據(jù)往往具有滯后性。在Spring Cloud中,負(fù)載信息的采集周期,服務(wù)消費(fèi)者將負(fù)載數(shù)據(jù)更新到注冊中心的續(xù)約周期,以及服務(wù)消費(fèi)者從服務(wù)注冊中心拉取服務(wù)注冊表的周期都導(dǎo)致了負(fù)載數(shù)據(jù)的滯后。如果能掌握負(fù)載的變化趨勢,對(duì)負(fù)載進(jìn)行預(yù)測,以負(fù)載預(yù)測值作為請(qǐng)求分配的依據(jù)運(yùn)用在負(fù)載均衡算法中,則能提升系統(tǒng)負(fù)載均衡的性能。本文提出了一種基于深度學(xué)習(xí)的負(fù)載預(yù)測模型,該模型使用GRU神經(jīng)網(wǎng)絡(luò)對(duì)負(fù)載進(jìn)行預(yù)測,降低負(fù)載數(shù)據(jù)的時(shí)延,提升負(fù)載均衡算法的準(zhǔn)確性。
深度學(xué)習(xí)的概念源于人工神經(jīng)網(wǎng)絡(luò)的研究,主要使用深度神經(jīng)網(wǎng)絡(luò)作為工具解決問題。當(dāng)深度學(xué)習(xí)用于時(shí)序數(shù)據(jù)預(yù)測時(shí),網(wǎng)絡(luò)結(jié)構(gòu)主要使用循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN) 。RNN是一類用于處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò),包括雙向RNN、門控RNN等。其中門控RNN,如LSTM和GRU,有效優(yōu)化了RNN中梯度爆炸和梯度消失問題。本文使用GRU神經(jīng)網(wǎng)絡(luò)進(jìn)行負(fù)載預(yù)測,相比LSTM[8],GRU簡化了門結(jié)構(gòu),能有效加快訓(xùn)練速度,提高計(jì)算效率[9]。
本文設(shè)計(jì)的GRU神經(jīng)網(wǎng)絡(luò)模型包含輸入層、隱藏層、輸入層三個(gè)模塊。定期采集的負(fù)載指標(biāo)信息通過上文提出的負(fù)載模型計(jì)算后得到原始負(fù)載數(shù)據(jù);原始負(fù)載數(shù)據(jù)經(jīng)過處理后從輸入層輸入;隱藏層使用GRU神經(jīng)元對(duì)輸入數(shù)據(jù)進(jìn)行計(jì)算;輸出層最終輸出結(jié)果,結(jié)構(gòu)如圖2所示。
1.3 網(wǎng)絡(luò)訓(xùn)練
使用GRU網(wǎng)絡(luò)進(jìn)行負(fù)載預(yù)測的訓(xùn)練步驟如下:
(1) 網(wǎng)絡(luò)搭建
本文使用TensorFlow框架搭建GRU網(wǎng)絡(luò)模型。使用Keras和Keras提供的容器Sequential構(gòu)建網(wǎng)絡(luò)。
(2) 網(wǎng)絡(luò)訓(xùn)練
本文選擇adam優(yōu)化器更新權(quán)重,損失函數(shù)使用MSE(Mean Squared Error) 如公式(9) 所示:
[Loss=1ni=1nyi-yi2] (9)
其中[n ]為樣本數(shù)量,[yi]與[yi]分別為真實(shí)負(fù)載與預(yù)測負(fù)載值。
(3) 超參數(shù)選取
為了提高預(yù)測的精度,本文通過實(shí)驗(yàn)對(duì)一些超參數(shù)進(jìn)行選取。需要實(shí)驗(yàn)選取的超參數(shù)包括歷史數(shù)據(jù)的長度、隱藏層的層數(shù)以及隱藏層的單元數(shù)量。本文使用交叉驗(yàn)證的方式,網(wǎng)絡(luò)搜索進(jìn)行參數(shù)選取。網(wǎng)格搜索定義一個(gè)三維方格,每格對(duì)應(yīng)一種超參數(shù)組合。
(4) 模型評(píng)價(jià)
使用MAPE和RMSE對(duì)模型進(jìn)行評(píng)價(jià),如公式(10)(11) 所示:
[MAPE=100%ni=1nyi-yiyi] (10)
[RMSE=1ni=1nyi-yi2] (11)
其中[n ]為樣本數(shù)量,[yi]與[yi]分別為真實(shí)負(fù)載與預(yù)測負(fù)載值。
2 基于深度學(xué)習(xí)負(fù)載預(yù)測的負(fù)載均衡算法
服務(wù)提供者的負(fù)載預(yù)測值將通過Spring Cloud的續(xù)約機(jī)制更新到服務(wù)注冊中心,并作為微服務(wù)元數(shù)據(jù)寫入服務(wù)注冊表,最終被服務(wù)消費(fèi)者拉取。Spring Cloud的續(xù)約周期與服務(wù)消費(fèi)者拉取服務(wù)注冊表的周期均會(huì)導(dǎo)致負(fù)載數(shù)據(jù)的滯后性。本文根據(jù)負(fù)載預(yù)測值計(jì)算各微服務(wù)節(jié)點(diǎn)權(quán)重,基于加權(quán)輪詢算法進(jìn)行請(qǐng)求分配,對(duì)未來負(fù)載變化趨勢不同的微服務(wù)節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)權(quán)重調(diào)整,從而有效避免負(fù)載滯后問題。
2.1 權(quán)重計(jì)算
(1) 初始權(quán)重:
記微服務(wù)節(jié)點(diǎn)[? ]的初始權(quán)重為[W'i],計(jì)算如公式(12) :
[W'i=CLoadi] (12)
其中[C ]為權(quán)重常量調(diào)節(jié)因子,[Load(i) ]為該節(jié)點(diǎn)的負(fù)載值。在初始未獲取微服務(wù)節(jié)點(diǎn)的動(dòng)態(tài)負(fù)載時(shí),[Load(i)]由微服務(wù)節(jié)點(diǎn)的靜態(tài)性能決定。
(2) 權(quán)重動(dòng)態(tài)調(diào)整
為了更準(zhǔn)確地調(diào)整微服務(wù)節(jié)點(diǎn)權(quán)重,本文設(shè)定了三個(gè)閾值[Loadl]、[Loadh]、[Loadm],并根據(jù)這三個(gè)閾值對(duì)微服務(wù)健康等級(jí)進(jìn)行分級(jí)。當(dāng)微服務(wù)負(fù)載值屬于[(0,Loadl)]時(shí),其處于低負(fù)載狀態(tài),健康等級(jí)記為[LLoad];當(dāng)負(fù)載值屬于[(Loadl,Loadh)]時(shí),其處于正常負(fù)載狀態(tài),健康等級(jí)記為[NLoad];當(dāng)負(fù)載值屬于[(Loadh,Loadm)]時(shí),其處于高負(fù)載狀態(tài),健康等級(jí)記為[HLoad];當(dāng)負(fù)載值屬于[(Loadm,1)]時(shí),其不可用,健康等級(jí)記為[Down]。
引入權(quán)重修正因子[β],計(jì)算如公式(13) :
[β=LoadiAvgLoadi ] (13)
其中[ AvgLoad(i) ]為該微服務(wù)所有實(shí)例的負(fù)載平均值。當(dāng)微服務(wù)實(shí)例健康等級(jí)為[LLoad],說明實(shí)例較空閑,剩余性能較好,應(yīng)當(dāng)增大其權(quán)重;健康等級(jí)為[NLoad],說明該實(shí)例處于正常狀態(tài),無需調(diào)整權(quán)重;健康等級(jí)為[HLoad],說明該實(shí)例負(fù)載較重,應(yīng)當(dāng)減少其權(quán)重;不可用實(shí)例權(quán)重為0。權(quán)重調(diào)整公式如公式(14) 所示。
[Wi=CWi+β,LLoadWi,NLoadWi-β,HLoad0, Down] (14)
根據(jù)動(dòng)態(tài)調(diào)整后的權(quán)重進(jìn)行請(qǐng)求分配,可以有效優(yōu)化負(fù)載不均的情況,提升系統(tǒng)的資源利用率。
2.2 算法運(yùn)行流程
考慮到當(dāng)系統(tǒng)整體負(fù)載較小時(shí),采用本文算法造成的資源消耗可能會(huì)影響負(fù)載均衡效果,故當(dāng)總平均響應(yīng)時(shí)間低于設(shè)定的閾值時(shí),本文采取Spring Cloud Ribbon內(nèi)置的WeightedResponseTimeRule。WeightedResponseTimeRule會(huì)根據(jù)響應(yīng)時(shí)間進(jìn)行權(quán)重計(jì)算,微服務(wù)節(jié)點(diǎn)的響應(yīng)時(shí)間越長,被選擇的概率就越小。
當(dāng)請(qǐng)求到達(dá)時(shí),服務(wù)消費(fèi)者節(jié)點(diǎn)會(huì)遍歷該請(qǐng)求需調(diào)用的微服務(wù)對(duì)應(yīng)的所有實(shí)例,計(jì)算所有實(shí)例的平均響應(yīng)時(shí)間[Tavg],若[Tavg]小于閾值[T],則說明目前系統(tǒng)中負(fù)載較小,采取Spring Cloud Ribbon內(nèi)置的WeightedResponseTimeRule進(jìn)行負(fù)載均衡。
若[Tavg]大于閾值[T],則采取基于深度學(xué)習(xí)負(fù)載預(yù)測的負(fù)載均衡算法。算法設(shè)計(jì)如算法1所示:
算法1 基于深度學(xué)習(xí)負(fù)載預(yù)測的負(fù)載均衡算法
輸入:需調(diào)用微服務(wù)對(duì)應(yīng)的所有實(shí)例集合[I];
輸出:權(quán)重最大的微服務(wù)實(shí)例[ Ik]。
1.? for each [ Ii∈ I] do
2.? ? [Load(i)] [← ]getPredictLoad([ Ii)];
3.? ? if [Load(i)] [∈(Loadm,1)] then
4.? ? ? Weight([ Ii])[ ← ]0
5.? ? else if [Load(i)] [∈(Load0,Loadl)] or [Load(i)] [∈(Loadh,Loadm)] then
6.? ? ? Weight([ Ii])[ ← ]adjustWeight([ Ii])
7.? ? else
8.? ? ? continue
9.? ? end if
10.? end for
11.? return getBiggestWeight([I])
算法1遍歷所有微服務(wù)實(shí)例,獲取各實(shí)例的負(fù)載預(yù)測值,判斷其是否需要調(diào)整權(quán)重,為負(fù)載較高或較低的微服務(wù)調(diào)整權(quán)重,不可用的微服務(wù)節(jié)點(diǎn)權(quán)重設(shè)置為0。重復(fù)上述過程,直到遍歷完畢,最終輸出權(quán)重最大的微服務(wù)實(shí)例,選擇該實(shí)例分配請(qǐng)求。
3 算法性能分析
本文使用基于Spring Cloud搭建的微服務(wù)應(yīng)用系統(tǒng)進(jìn)行測試。選取平均響應(yīng)時(shí)間與吞吐量這兩個(gè)評(píng)價(jià)指標(biāo),使用Jmeter模擬用戶并發(fā)請(qǐng)求,驗(yàn)證本文對(duì)Spring Cloud負(fù)載均衡性能的提升。
將本文提出的算法與Spring CloudRibbon內(nèi)置的BestAvailableRule、WeightedResponseTimeRule進(jìn)行實(shí)驗(yàn)對(duì)比,測試結(jié)果如下,平均響應(yīng)時(shí)間見圖3,吞吐量見圖4。
從圖3與圖4的實(shí)驗(yàn)結(jié)果可以看出,當(dāng)并發(fā)線程數(shù)較少時(shí),本文算法與Ribbon內(nèi)置算法對(duì)比沒有明顯優(yōu)勢。這是由于在并發(fā)量較小的情況下,平均響應(yīng)時(shí)間與吞吐量主要取決于算法本身的復(fù)雜度,本文在負(fù)載較輕時(shí)會(huì)采取 Ribbon 內(nèi)置的 WeightedResponseTimeRule。但當(dāng)并發(fā)線程數(shù)在1000及以上時(shí),應(yīng)用本文提出的算法明顯增加了系統(tǒng)的吞吐量,減少了平均響應(yīng)時(shí)間,提升了系統(tǒng)的負(fù)載均衡效果。因此可以得出本文提出的算法,在并發(fā)量比較高的情況下要優(yōu)于Ribbon的內(nèi)置算法。
4 結(jié)束語
本文針對(duì)微服務(wù)框架Spring Cloud中內(nèi)置負(fù)載均衡算法負(fù)載衡量不全面與負(fù)載滯后的缺點(diǎn),提出了一種基于深度學(xué)習(xí)負(fù)載預(yù)測的負(fù)載均衡算法。該算法定期采集微服務(wù)節(jié)點(diǎn)的負(fù)載信息,通過一種較全面的負(fù)載模型進(jìn)行負(fù)載計(jì)算,并使用GRU神經(jīng)網(wǎng)絡(luò)對(duì)負(fù)載值進(jìn)行預(yù)測,根據(jù)負(fù)載預(yù)測結(jié)果進(jìn)行權(quán)重計(jì)算,微服務(wù)節(jié)點(diǎn)的權(quán)重能根據(jù)負(fù)載的變化趨勢進(jìn)行動(dòng)態(tài)調(diào)整,使客戶端請(qǐng)求分配更加合理。實(shí)驗(yàn)結(jié)果表明,該算法與Spring Cloud Ribbon中的內(nèi)置算法相比,在并發(fā)線程數(shù)較多的情況下,有效地優(yōu)化了負(fù)載均衡性能,進(jìn)一步提升了微服務(wù)應(yīng)用系統(tǒng)的響應(yīng)速度與資源利用率。
參考文獻(xiàn):
[1] SHABANII,BERISHAB,BIBAT,et al.Designof Modern Distributed Systems based on Microservices Architecture[J].International Journal of Advanced Computer Science and Applications,2021,12(2):153-159.
[2] Villamizar M,Garcés O,Ochoa L,et al.Cost comparison of running web applications in the cloud using monolithic,microservice,and AWS Lambda architectures[J].Service Oriented Computing and Applications,2017,11(2):233-247.
[3] Balalaie A,Heydarnoori A,Jamshidi P.Microservices architecture enables DevOps:migration to a cloud-native architecture[J].IEEE Software,2016,33(3):42-52.
[4] Liu G Z,Huang B,Liang Z H,et al.Microservices:architecture,container,and challenges[C]//2020 IEEE 20th International Conference on Software Quality,Reliability and Security Companion.December 11-14,2020,Macao,China.IEEE,2020:629-635.
[5] 云原生產(chǎn)業(yè)聯(lián)盟.中國云原生用戶調(diào)研報(bào)告(2020年):云原生熱點(diǎn)技術(shù)使用現(xiàn)狀全披露[EB/OL].[2022-2-21].https://www.sohu.com/a/426326675_753085.
[6] Wang H,Wang Y,Liang G Y,et al.Research on load balancing technology for microservice architecture[J].MATEC Web of Conferences,2021,336:8002.
[7] DANNER M,GERBERA.Patient Involvement in Health Technology Assessment[M].Gewerbestrasse:Springer,2017.
[8] Song B B,Yu Y,Zhou Y,et al.Host load prediction with long short-term memory in cloud computing[J].The Journal of Supercomputing,2018,74(12):6554-6568.
[9] Yamak P T,Li Y J,Gadosey P K.A comparison between ARIMA,LSTM,and GRU for time series forecasting[C]//ACAI 2019:Proceedings of the 2019 2nd International Conference on Algorithms,Computing and Artificial Intelligence.2019:49-55.
【通聯(lián)編輯:唐一東】
收稿日期:2021-12-15
作者簡介:吳嵐若(1997—) ,女,安徽銅陵人,碩士,研究方向?yàn)檐浖こ獭?/p>