









摘要:針對微服務框架Spring Cloud中內置負載均衡算法不能全面反映負載與負載滯后的不足,文章提出一種基于深度學習負載預測的負載均衡算法,以更全面的負載模型衡量微服務節點的負載,并使用GRU神經網絡進行負載預測,根據負載預測值動態調整微服務節點的權重,再基于加權輪詢算法進行負載均衡,進一步地提升微服務應用系統的響應速度與資源利用率。實驗采用Jmeter進行仿真測試,并將本文提出的算法與Spring Cloud的內置算法進行對比。實驗結果表明,在線程并發數較多的情況下,該算法能更有效地在使用Spring Cloud搭建的微服務應用系統中實現負載均衡。
關鍵詞:微服務;Spring Cloud;負載均衡;GRU網絡;負載預測
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)10-0080-04
隨著互聯網技術與云計算的發展,單體架構已經越來越不適應于日新月異的應用需求。在單體架構中,應用程序通常被構建為一個不可分割的整體[1],隨著項目的擴展,單體架構應用的開發、部署、維護會越來越困難[2],因此,微服務架構逐漸興起。微服務架構是旨在將軟件系統分解為一組獨立的微小服務的云原生架構[3],這組微小服務可以獨立部署在不同平臺,也可以使用不同的技術棧。微服務架構可以克服單體架構的缺點,增強系統的可擴展性、高并發性、高可用性[4],因此被越來越多的企業與研究機構使用。
在各種微服務框架中,Spring Cloud是較為流行的一種。據云原生產業聯盟發布的《中國云原生用戶調研報告(2020年) 》[5]顯示,Spring Cloud是微服務架構的用戶首選。由于微服務架構將軟件系統分解為了粒度較小的微服務,故服務治理技術也更加復雜。在服務治理技術中,負載均衡技術十分關鍵,通過優化微服務架構中的負載均衡技術可以有效減少請求延遲,提高微服務架構的可靠性和資源利用率[6]。
Spring Cloud Ribbon是Spring Cloud的負載均衡組件,其內置負載均衡算法存在負載衡量不全面與負載滯后的缺點。如果能較為全面地計算負載值,并掌握負載變化的未來趨勢,對負載值進行預測,則能更好地提升負載均衡算法的性能。本文針對Spring Cloud Ribbon中存在的問題,提出了一種基于深度學習負載預測的負載均衡算法,該算法提出了一種更全面的模型衡量負載,并對負載進行預測,進一步提升了微服務應用系統的響應速度與資源利用率。
1 負載預測
1.1 微服務節點負載模型
微服務節點的負載能反映微服務節點的處理性能。選取適當的負載評價指標對負載進行計算得到綜合負載值,再基于綜合負載值進行請求分配,可以進一步提升負載均衡算法的準確性。
本文選取了CPU利用率、內存利用率、網絡利用率、IO利用率四個負載評價指標衡量節點的動態負載。由于節點本身的服務器配置也會影響到節點的性能,并且配置信息一般不會改變,因此本文將服務器的配置信息也加入負載的衡量中。
為了更準確地表示微服務節點的負載,引入以下定義:
定義1:靜態性能
微服務節點的配置信息可以反映節點的基礎性能,本文采用的配置信息有CPU核心數、內存容量與網絡帶寬。節點[ ? ]的靜態性能(Static Capacity)記為[SCi],計算如公式(1) 所示:
通過上述計算得出本文構造的判斷矩陣[A]通過一致性檢驗,故可將歸一化特征向量作為權向量。
1.2 GRU神經網絡模型
負載具有實時性,而動態負載均衡算法中使用的負載數據往往具有滯后性。在Spring Cloud中,負載信息的采集周期,服務消費者將負載數據更新到注冊中心的續約周期,以及服務消費者從服務注冊中心拉取服務注冊表的周期都導致了負載數據的滯后。如果能掌握負載的變化趨勢,對負載進行預測,以負載預測值作為請求分配的依據運用在負載均衡算法中,則能提升系統負載均衡的性能。本文提出了一種基于深度學習的負載預測模型,該模型使用GRU神經網絡對負載進行預測,降低負載數據的時延,提升負載均衡算法的準確性。
深度學習的概念源于人工神經網絡的研究,主要使用深度神經網絡作為工具解決問題。當深度學習用于時序數據預測時,網絡結構主要使用循環神經網絡(RNN) 。RNN是一類用于處理序列數據的神經網絡,包括雙向RNN、門控RNN等。其中門控RNN,如LSTM和GRU,有效優化了RNN中梯度爆炸和梯度消失問題。本文使用GRU神經網絡進行負載預測,相比LSTM[8],GRU簡化了門結構,能有效加快訓練速度,提高計算效率[9]。
本文設計的GRU神經網絡模型包含輸入層、隱藏層、輸入層三個模塊。定期采集的負載指標信息通過上文提出的負載模型計算后得到原始負載數據;原始負載數據經過處理后從輸入層輸入;隱藏層使用GRU神經元對輸入數據進行計算;輸出層最終輸出結果,結構如圖2所示。
1.3 網絡訓練
使用GRU網絡進行負載預測的訓練步驟如下:
(1) 網絡搭建
本文使用TensorFlow框架搭建GRU網絡模型。使用Keras和Keras提供的容器Sequential構建網絡。
(2) 網絡訓練
本文選擇adam優化器更新權重,損失函數使用MSE(Mean Squared Error) 如公式(9) 所示:
[Loss=1ni=1nyi-yi2] (9)
其中[n ]為樣本數量,[yi]與[yi]分別為真實負載與預測負載值。
(3) 超參數選取
為了提高預測的精度,本文通過實驗對一些超參數進行選取。需要實驗選取的超參數包括歷史數據的長度、隱藏層的層數以及隱藏層的單元數量。本文使用交叉驗證的方式,網絡搜索進行參數選取。網格搜索定義一個三維方格,每格對應一種超參數組合。
(4) 模型評價
使用MAPE和RMSE對模型進行評價,如公式(10)(11) 所示:
[MAPE=100%ni=1nyi-yiyi] (10)
[RMSE=1ni=1nyi-yi2] (11)
其中[n ]為樣本數量,[yi]與[yi]分別為真實負載與預測負載值。
2 基于深度學習負載預測的負載均衡算法
服務提供者的負載預測值將通過Spring Cloud的續約機制更新到服務注冊中心,并作為微服務元數據寫入服務注冊表,最終被服務消費者拉取。Spring Cloud的續約周期與服務消費者拉取服務注冊表的周期均會導致負載數據的滯后性。本文根據負載預測值計算各微服務節點權重,基于加權輪詢算法進行請求分配,對未來負載變化趨勢不同的微服務節點進行動態權重調整,從而有效避免負載滯后問題。
2.1 權重計算
(1) 初始權重:
記微服務節點[? ]的初始權重為[W'i],計算如公式(12) :
[W'i=CLoadi] (12)
其中[C ]為權重常量調節因子,[Load(i) ]為該節點的負載值。在初始未獲取微服務節點的動態負載時,[Load(i)]由微服務節點的靜態性能決定。
(2) 權重動態調整
為了更準確地調整微服務節點權重,本文設定了三個閾值[Loadl]、[Loadh]、[Loadm],并根據這三個閾值對微服務健康等級進行分級。當微服務負載值屬于[(0,Loadl)]時,其處于低負載狀態,健康等級記為[LLoad];當負載值屬于[(Loadl,Loadh)]時,其處于正常負載狀態,健康等級記為[NLoad];當負載值屬于[(Loadh,Loadm)]時,其處于高負載狀態,健康等級記為[HLoad];當負載值屬于[(Loadm,1)]時,其不可用,健康等級記為[Down]。
引入權重修正因子[β],計算如公式(13) :
[β=LoadiAvgLoadi ] (13)
其中[ AvgLoad(i) ]為該微服務所有實例的負載平均值。當微服務實例健康等級為[LLoad],說明實例較空閑,剩余性能較好,應當增大其權重;健康等級為[NLoad],說明該實例處于正常狀態,無需調整權重;健康等級為[HLoad],說明該實例負載較重,應當減少其權重;不可用實例權重為0。權重調整公式如公式(14) 所示。
[Wi=CWi+β,LLoadWi,NLoadWi-β,HLoad0, Down] (14)
根據動態調整后的權重進行請求分配,可以有效優化負載不均的情況,提升系統的資源利用率。
2.2 算法運行流程
考慮到當系統整體負載較小時,采用本文算法造成的資源消耗可能會影響負載均衡效果,故當總平均響應時間低于設定的閾值時,本文采取Spring Cloud Ribbon內置的WeightedResponseTimeRule。WeightedResponseTimeRule會根據響應時間進行權重計算,微服務節點的響應時間越長,被選擇的概率就越小。
當請求到達時,服務消費者節點會遍歷該請求需調用的微服務對應的所有實例,計算所有實例的平均響應時間[Tavg],若[Tavg]小于閾值[T],則說明目前系統中負載較小,采取Spring Cloud Ribbon內置的WeightedResponseTimeRule進行負載均衡。
若[Tavg]大于閾值[T],則采取基于深度學習負載預測的負載均衡算法。算法設計如算法1所示:
算法1 基于深度學習負載預測的負載均衡算法
輸入:需調用微服務對應的所有實例集合[I];
輸出:權重最大的微服務實例[ 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遍歷所有微服務實例,獲取各實例的負載預測值,判斷其是否需要調整權重,為負載較高或較低的微服務調整權重,不可用的微服務節點權重設置為0。重復上述過程,直到遍歷完畢,最終輸出權重最大的微服務實例,選擇該實例分配請求。
3 算法性能分析
本文使用基于Spring Cloud搭建的微服務應用系統進行測試。選取平均響應時間與吞吐量這兩個評價指標,使用Jmeter模擬用戶并發請求,驗證本文對Spring Cloud負載均衡性能的提升。
將本文提出的算法與Spring CloudRibbon內置的BestAvailableRule、WeightedResponseTimeRule進行實驗對比,測試結果如下,平均響應時間見圖3,吞吐量見圖4。
從圖3與圖4的實驗結果可以看出,當并發線程數較少時,本文算法與Ribbon內置算法對比沒有明顯優勢。這是由于在并發量較小的情況下,平均響應時間與吞吐量主要取決于算法本身的復雜度,本文在負載較輕時會采取 Ribbon 內置的 WeightedResponseTimeRule。但當并發線程數在1000及以上時,應用本文提出的算法明顯增加了系統的吞吐量,減少了平均響應時間,提升了系統的負載均衡效果。因此可以得出本文提出的算法,在并發量比較高的情況下要優于Ribbon的內置算法。
4 結束語
本文針對微服務框架Spring Cloud中內置負載均衡算法負載衡量不全面與負載滯后的缺點,提出了一種基于深度學習負載預測的負載均衡算法。該算法定期采集微服務節點的負載信息,通過一種較全面的負載模型進行負載計算,并使用GRU神經網絡對負載值進行預測,根據負載預測結果進行權重計算,微服務節點的權重能根據負載的變化趨勢進行動態調整,使客戶端請求分配更加合理。實驗結果表明,該算法與Spring Cloud Ribbon中的內置算法相比,在并發線程數較多的情況下,有效地優化了負載均衡性能,進一步提升了微服務應用系統的響應速度與資源利用率。
參考文獻:
[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] 云原生產業聯盟.中國云原生用戶調研報告(2020年):云原生熱點技術使用現狀全披露[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.
【通聯編輯:唐一東】
收稿日期:2021-12-15
作者簡介:吳嵐若(1997—) ,女,安徽銅陵人,碩士,研究方向為軟件工程。