余 航,邢長友,許 博,丁 科
(陸軍工程大學 指揮控制工程學院,江蘇 南京210007)
微服務化的軟件系統(tǒng),其組成部分是眾多相對獨立的微服務[1],微服務以其松散耦合的特性,為軟件系統(tǒng)增強其韌性提供了強大支撐。傳統(tǒng)的單體架構存在可靠性低、可重用性差、體量臃腫等問題[2],這使得軟件系統(tǒng)的部署、開發(fā)、應用都更加困難。相對于前者而言,微服務具有敏捷部署、獨立開發(fā)、多語言支持等優(yōu)勢[3],這使得微服務能夠基于冗余和多樣性技術手段[4],允許跨地理分布的服務集群實現快速配置和更新集群狀態(tài),有助于增強軟件系統(tǒng)韌性的同時,降低分布式服務集群的部署成本。對用戶而言,系統(tǒng)本身的韌性能力反映在系統(tǒng)為用戶分配的服務鏈上。
微服務架構下,服務鏈是指由若干個執(zhí)行不同功能的微服務組件相互協同組成,用于滿足用戶需要,響應用戶請求的有機整體。組成服務鏈的各微服務組件獨立工作、互不干擾、可自由組合。服務鏈中各微服務之間松散耦合的特性使得其韌性能力可以視為各服務組件的韌性能力之和,微服務組件本身所具有的屬性和所使用的技術手段決定了組件運行給系統(tǒng)帶來的韌性增強。此外,對于系統(tǒng)運維而言,各微服務組件所采取的技術手段越多,系統(tǒng)復雜度越高,維護成本和復雜性也隨之上升。
本文所研究的韌性編排問題是指確定和選擇最佳微服務組件實例,組成一個完整的服務鏈(Service Chain,SC),在滿足軟件系統(tǒng)功能的條件下,使得系統(tǒng)韌性得到增強的工作流程。在微服務化的軟件系統(tǒng)中,編排問題是最亟需解決的重點問題之一。
為解決上述問題,本文提出了一種韌性驅動的微服務編排框架RMOF,框架針對微服務組件本身的韌性能力水平和服務鏈整體復雜性進行了考察。本文的主要貢獻包括:
(1) 建立了一套基于不同韌性目標,以用戶滿意度作為導向的微服務韌性編排數學優(yōu)化模型。并在此基礎上設計了綜合考慮系統(tǒng)的韌性目標、風險、應對技術以及實現代價的微服務編排模型。
(2) 提出了GA -PP 算法,對微服務的編排問題進行優(yōu)化,能夠在保證優(yōu)化編排方案的同時兼顧計算效率。
傳統(tǒng)解決編排問題的一般方法通常包括輪詢法、隨機化方法或由專家根據經驗確定優(yōu)先級來解決等[5],以上方法存在可靠性不足和嚴重依賴專業(yè)經驗的問題。并且在微服務化軟件系統(tǒng)中,隨著微服務組件數量的增加,問題解決的難度也隨之上升[6],此外傳統(tǒng)方法不具備足夠的通用性,推廣意義較為有限。
早期關于服務編排機制的工作主要基于服務質量(Quality of Service,QoS) 感知開展。QoS 屬性通常包括響應時間、可用性、可靠性和價格成本等,文獻[7-9]專注于基于QoS 感知的服務組合及其在中間件中的實現,不足之處在于沒有定量地描述帶有風險的安全目標,并在實際的云環(huán)境中解決它們。大量研究側重于單個服務鏈的QoS 優(yōu)化,而忽略了實例之間的共享和競爭。為了解決這個問題,Ding等人提出了一種基于列表調度的微服務選擇算法(Microservice Service Selection algorithm,MSS)[10]。該算法采用工作流模型來對服務鏈進行描述,分析實例的處理速度、網絡傳輸速度和任務并發(fā)程度,計算每個任務的分期限,根據分期限和其他信息,實時計算和更新每個任務的調度緊迫性。最后,提出了基于分期限和緊迫性的兩種服務選擇策略,以完成微服務實例選擇,構成服務鏈。
大規(guī)模分布式云環(huán)境的高度復雜性導致了大量的不確定性,而這些不確定性無法通過常規(guī)信息安全方法的可用性來建模[11]。Wen 等人創(chuàng)新地從安全性角度出發(fā),針對內部安全威脅和外部環(huán)境不確定性進行建模,并在Spark 上采用了新穎的分布式并行遺傳算法框架GA-Par[12]來提供可靠的微服務編排并處理所涉及的計算效率問題,以降低大規(guī)模部署下執(zhí)行編排算法的時間耗費,旨在為異地部署的數據中心微服務編排提供最佳解決方案。
因此,隨著當前微服務化的不斷推進以及系統(tǒng)韌性重要程度日漸上升,迫切需要一種用以量化微服務化軟件系統(tǒng)韌性的通用機制,為實現韌性編排提供有力支撐。
關于編排問題的計算解決方案,研究人員已經證明,在大規(guī)模云環(huán)境中,問題的復雜度將隨著系統(tǒng)規(guī)模擴張而爆炸式上升,諸如混合整數非線性規(guī)劃(MINLP) 或線性規(guī)劃(MIP) 等方法是不可行的[6],而遺傳算法等啟發(fā)式算法已被廣泛用于優(yōu)化資源調度、服務編排和任務分配[12-14]。
圖1 描述了一個實時信息系統(tǒng)。用戶在通過代理到達Web 前端后,可以分別通過用戶注冊、用戶注銷、用戶登錄的微服務組件實現注冊、注銷和登錄,而這些操作又要通過后續(xù)負責數據庫管理的微服務組件和后端用戶信息數據庫交互來得以實現,從而使得業(yè)務系統(tǒng)得以持續(xù)。在該系統(tǒng)中,整個系統(tǒng)的韌性程度可以看作是各個服務鏈上單個微服務組件的韌性能力之和,以及微服務組件之間的相互影響因素。

圖1 實時信息系統(tǒng)架構
圖2 所示是微服務化的軟件系統(tǒng)架構,圖中基礎設施層每個部署節(jié)點上都維護一個服務注冊表,注冊代理發(fā)現各微服務組件(如Service,DBMS 等) 并完成注冊。各微服務組件通過心跳報文在完成注冊后向節(jié)點上的代理上報當前狀態(tài)等信息。表示用戶的Client 向請求代理Agent 發(fā)起服務請求后,Agent對請求進行解析,隨后根據各部署節(jié)點上報的服務名單選擇相應的服務實例執(zhí)行,從而形成服務鏈,并根據相應的編排結果生成路由表項,下發(fā)至各SDN 交換機,以流控制的方式使系統(tǒng)中的業(yè)務流根據控制中心給出的方案進行執(zhí)行。

圖2 微服務化軟件系統(tǒng)架構
為了實現韌性編排,需要處理以下問題:
(1) 如何表征存在損害系統(tǒng)韌性的可能風險,同時不同版本、基于不同技術實現、旨在實現同一功能目標的微服務組件為集群帶來的韌性增益是不同的,如何利用可能存在的風險和韌性增強技術來量化微服務編排中的韌性目標滿意度?
(2) 如何處理軟件系統(tǒng)在不同韌性階段所側重目標一致的問題?
(3) 如何評估為增強系統(tǒng)韌性所需付出的代價,即如何對系統(tǒng)復雜性進行合理量化?
(4) 如何應對在系統(tǒng)規(guī)模擴張下不斷增加的計算復雜性?
微服務韌性被認為是未來互聯網的基本設計屬性[15],是網絡在面對正常運行下產生的故障和挑戰(zhàn)時提供和維持可接受的服務水平的能力[16]。在軟件系統(tǒng)中,韌性是一個總體概念,脫離系統(tǒng)整體來考慮單個微服務組件的韌性能力是沒有意義的。
多樣性和冗余技術手段的運用,使得對于每個微服務而言,都有一組微服務組件可以實現相應的功能。而在軟件系統(tǒng)運行的不同階段、不同步驟中,單個微服務組件對整個軟件系統(tǒng)產生的韌性增益是不同的,因此需要提出一套合理的韌性評價體系,對于不同情況下對每個候選微服務組件進行韌性評價,選擇最符合需求的微服務組件進入服務鏈中。本文從用戶的角度出發(fā),基于多種韌性目標,根據評估體系對候選微服務組件韌性計算用戶滿意度,從而對各組件進行評價。
為了處理2.1 節(jié)所提問題(1)、(2),本文首先對不同階段的韌性目標進行明確,并說明韌性階段、韌性目標、風險、韌性技術、用戶滿意度之間的關系。由于多種原因,現實中軟件系統(tǒng)的韌性能力可能會面臨一些風險,例如內存耗盡、隔離失效、惡意軟件、惡意內部人員、錯誤刪除等。但是,各種不同的微服務組件由于使用了多樣化的技術手段對風險進行削弱或遏制,使得軟件系統(tǒng)的韌性得以增強。因此,在不同的韌性階段,各韌性目標的實現既取決于潛在的風險,同時又取決于各組件所使用的技術對風險的緩解程度。而用戶滿意度則來源于候選組件使用技術手段對風險的緩解程度與用戶期望之間的差距。
(1) 不同階段的韌性目標
在Kott 等人的《Cyber Resilience of Systems and Networks 》[17]一書中,系統(tǒng)韌性需求根據系統(tǒng)運行時所處于的不同階段,被劃分成預測、抵抗、恢復、適應四個階段,各階段所側重的韌性目標有所不同,其對應關系如表1 所示。
根據表1 所示,在軟件系統(tǒng)運行的不同階段,用戶對韌性目標有著不同的需求,因此t階段的總體韌性指標可以表示為:

表1 各階段系統(tǒng)韌性目標

其中,DSR (Degree of Service Resilience) 表示總體韌性程度,通過用戶對微服務組件sih的滿意度來計算,t表示軟件運行的階段,nt表示該階段所考慮的韌性目標數量,Mq(u,sih) 表示在第t階段用戶u對微服務sih在第q個韌性目標上的滿意度,wqi(t) 表示t階段不同韌性目標的權重,即重要程度。
(2) 韌性目標與風險之間的映射
Kott 等人[17]提出韌性目標集合共包括七大目標,韌性目標與主要風險間的映射情況如表2 所示。

表2 韌性目標風險映射表
(3) 單風險下微服務組件韌性
本文利用各微服務組件所使用的風險預防技術來衡量它們的韌性增益。表3 顯示了本文的部分符號釋義。

表3 部分符號釋義
假設微服務的韌性水平取決于所使用的相應技術手段的數量和質量,例如,可以通過多種技術或策略來防止某種類型的風險,并且當獨立使用這些技術手段時,它們分別具備多種功能。此外,假設通過將更合適的技術應用于微服務會對系統(tǒng)韌性產生增益效果。下面將詳細介紹如何計算微服務的韌性水平。
根據假設,某微服務組件可以通過一組技術和策略TechRk處理風險Rk,因此,該組件使用技術手段或策略緩解風險Rk,從而增強系統(tǒng)韌性的能力可以量化為:

其中Vj表示降低風險Rk的技術j的性能。如果微服務S提供了一系列技術和政策TechS,那么微服務S緩解風險Rk的能力可以表示為:

(4) 微服務組件韌性評估
再次以圖1 中的實時信息系統(tǒng)為例,實際運行中,既需要保證微服務本身的韌性增益,同時需要確保微服務之間的信息傳遞滿足韌性目標要求。
由于冗余和多樣性的使用,同一微服務對應有一組實現相同功能的組件,本文的工作就是要建立適合的評估模型,對微服務鏈上的這一組微服務組件進行韌性評估,選出最能增強系統(tǒng)韌性的組件進入服務鏈。本文定義了一個服務韌性程度指標(Degree of Service Resilience,DSR),該指標描述了被評估組件所能提供的韌性能力與用戶需求之間的比值,即用戶滿意程度,用以衡量韌性能力水平。在這一背景下,假設t階段被選中的某個微服務組件sih可以完全滿足用戶的需求,那么DSR 需要滿足以下條件:

DSR 的具體計算方式由下式確定:


而Mq(u,sih) 表示用戶u對候選微服務組件sih在第q個目標上的滿意度,其計算方法如下:


關于韌性代價問題,即2.1 節(jié)中所提問題(3 ),上文中已經提到,軟件系統(tǒng)微服務化帶來的最大問題在于復雜性提高帶來的運維開銷和困難[18],因此本節(jié)需要對系統(tǒng)復雜性進行建模。代價建模相關指標如表4 所示。

表4 代價建模相關指標
在形式上,微服務化的軟件系統(tǒng)提供服務的服務鏈可以表示為有向無回路圖G=(S,E)。如圖3 所示,頂點S(如Service A1) 對應于微服務組件,而邊E對應于在它們之間傳輸的數據或消息。

圖3 業(yè)務流DAG 圖
具體來說,軟件系統(tǒng)中的每類微服務i都有一組候選微服務Si,其中候選h用sih∈Si表示,該候選組件所使用技術集合的表示符號為,因此單個微服務組件的韌性代價可以表示為該組件所使用的技術數量,即其復雜性指標,可用符號表示。
由于每個候選微服務組件sip在不同階段在不同微服務之間可能具有不同的復雜性關系,本文將使用編排得到的服務鏈總體技術多樣性度量作為指標對韌性代價進行建模。因此對于圖中的某一條服務鏈SC,其韌性代價可以表示為該鏈上所有微服務組件所使用的技術種類數量,即并集的元素數量,與可使用的技術總量之比,如式(9) 所示:

其中,|TechA| 表示系統(tǒng)內微服務組件可選用的技術全集的元素數量,即:

在單微服務組件編排的情況下,對用戶u 而言,t階段在微服務Si的候選組件中選擇sih的總體效用函數可以表示為式(11):

其中,λ 表示影響因子,即考慮韌性成本對編排結果產生影響的重要性程度。
由于單編排問題中,服務鏈中只有一個微服務組件,因此在考慮韌性代價時不需要考慮鏈中的其他微服務:

優(yōu)化的目標在于使得在提高服務鏈韌性的同時,盡可能控制所需付出的代價。因此,其優(yōu)化目標可以寫成:

在多微服務組件編排的情況下,由于服務鏈中包含多個微服務組件,因此在討論解決方案時需對整個服務鏈上的所有微服務組件進行考慮,假設該服務鏈SC 長度為n,每個微服務的候選者數量為m。對用戶u 而言,t 階段通過編排得到服務鏈SC 的總體效用函數可以表示為:

其中,需要注意的是:

為了解決2.1 節(jié)中所提問題(4),本文提出了一種部分保留的遺傳算法GA -PP 。本節(jié)將簡要概述這一解決方案,并對算法結構設計和實現做詳細介紹。
(1) 算法概述
關于問題的求解,在本文的問題背景下,當需要通過編排得到的服務鏈SC 長度為n,每個微服務的候選組件數量為m 時,將問題命名為Arrangement(n,m)。問題Arrangement (n,m) 的解空間大小,就是所有微服務組件所能組合形成的服務鏈數量,因此其解空間大小為mn,是一個NP 難問題,顯然使用簡單的搜索算法是無法在有效時間內得到解決的。同時,由于整數非線性規(guī)劃(MINLP) 或線性規(guī)劃(MIP) 等方法是不可行的,因此需要使用啟發(fā)式算法解決[19-20]。
遺傳算法是一種典型的啟發(fā)式算法,通常用于解決此類最優(yōu)化問題[21]。但遺傳算法存在收斂性問題[22],由于其選擇、交叉、突變機制無法保證向著優(yōu)化的方向變化,因此難以確保收斂。Eiben 等人[23]已經證明,合適的選擇策略能夠使遺傳算法不斷收斂。本文提出了一種部分保留的遺傳算法GA -PP,該算法旨在得到問題Arrangement(n,m) 的一個較優(yōu)的可行解。
在GA-PP 中,每個染色體代表一個服務鏈個體,即一種解決方案,每個染色體上都有固定長度的多個基因,每個基因代表服務鏈中的一個微服務組件。根據3.1 節(jié)中給出的優(yōu)化目標,本文將優(yōu)化目標Value 作為遺傳算法的適應度函數。GA-PP 主要包含四個階段: 選擇、交叉、突變、保留。通過每一輪迭代篩選出種群中的精英,保留部分較優(yōu)的精英直接進入下一代種群中,通過不斷迭代最終得到一個可行解。
(2) 算法實現
傳統(tǒng)的遺傳算法中,突變過程中基因突變方向是不確定的,這對于連續(xù)且變化程度不過于劇烈的函數而言并不會造成太大影響,只要在數次突變中有若干次突變朝著結果優(yōu)化的方向發(fā)展,就能將優(yōu)秀的基因保留下來。而在本文所討論的問題Arrangement(n,m) 中,無論是染色體(服務鏈SC)、基因(微服務組件) 還是適應度函數(Value) 都是離散的,并且無論是選擇、交叉還是突變,都有可能導致優(yōu)秀基因的流失,這對于遺傳算法的收斂性提出了更高的要求。
為了更直觀地描述GA-PP 算法,本文將算法流程繪制如圖4 所示。圖中描述了一種引入“ 精英保留” 機制的遺傳算法,在每一代次種群計算完適應度Value 后,都將其中的優(yōu)秀染色體保留下來,同時“ 記住” 表現較差的個體,在每一輪突變結束后即將進入下一輪種群Value 值計算之前,將之前“ 記住”的較差個體用保留下來的優(yōu)秀個體進行替換。對于表現差的個體而言,該染色體上絕大部分基因都是表現不佳的,因此無論是否經過交叉還是突變,都難以使其從表現較差的個體轉變成“ 精英”,因此使用保留下來的精英個體對其進行替換,既能將優(yōu)秀的染色體保留到下一代次,確保其不斷收斂,同時起到基因篩選的效果。
圖4 詳細說明了GA -PP 算法執(zhí)行的全過程。Arrangement (n,m) 問題下,每個染色體長度為n,染色體個體上每個基因有m 種表達。種群在完成初始化后,首先使用0-1 編碼的方式對種群中每個染色體和基因進行編碼,每個基因的編碼長度為log2m 。通過計算種群中每個個體的適應度Value,可以得到種群中最優(yōu)、最劣的部分個體,這部分個體將在種群完成選擇、交叉、突變三個遺傳算法的傳統(tǒng)過程后完成替換,將最劣的部分個體替換成最優(yōu)的部分個體,從而使得最優(yōu)個體,即精英能夠順利進入下一代次的迭代中,保證迭代結果能夠一直向著更優(yōu)的方向發(fā)展。

圖4 算法流程圖
其中核心步驟包括圖4 中標注的①~④四個步驟:
①選擇: 本文使用輪盤賭法對每一代次的種群進行淘汰選擇,目的是使表現好的染色體進入到后續(xù)的遺傳過程中;
②交叉:種群中的相鄰個體以一定的概率雜交,以選擇得到的 “好” 染色體為基礎,產生新的染色體;
③突變: 以一定概率使得染色體中的個別基因發(fā)生突變,以期得到可能的更好的染色體;
④保留: 將每一代次中的精英保留下來直接進入下一代次,保證迭代過程中新產生的種群中最高的Value 值至少不會低于上一代次,防止算法無法收斂。
GA-PP 算法偽代碼如下:


(1) 平臺。本文所有實驗均在ThinkPad T470p 上執(zhí)行,其處理器為Intel?CoreTMi7-7700HQ CPU @2.80 GHz×8,內存大小為16 GB,使用Ubuntu 16.04操作系統(tǒng)。
(2) 數據。除了上文表1 、表2 中提到的兩組映射關系外,本文所使用的數據還包括了13000 條請求與技術映射記錄,以及風險- 技術映射表。
(3) 方法。本文通過運行隨機選擇(Random)、傳統(tǒng)遺傳算法(GA) 和GA -PP 對服務鏈進行編排,針對不同韌性階段、不同問題規(guī)模、不同服務鏈長度下求解Arrangement (n,m) 問題,比較Random 、GA 、GA -PP 三種算法編排下得到目標服務鏈Value 值在4個韌性階段下的均值,評估本文所給出的韌性編排算法的有效性。
(4) 指標。根據3.1 節(jié)給出的計算最終Value 值公式,分別在4個韌性階段,通過應用不同算法得到服務鏈編排結果,對4個韌性階段得到的Value值求均值,作為最終比較的效用指標。
在本節(jié)中,將通過運用三種算法在不同情況下解決Arrangement (n,m) 問題,以此來研究在定量韌性測量框架下使用GA -PP 算法帶來的效用改善,并評估使用不同方案可獲得的效用值。
(1) 不同韌性階段的算法表現
圖5 所示是在(n,m)=(10,64) 的情況下,Random、GA 、GA-PP 三種算法在不同韌性階段的迭代情況,橫坐標為迭代輪次,縱坐標為編排得到的目標服務鏈的Value 值。可以看出,三種算法中,由于Random不存在迭代問題,因此其表現在三種算法中較差。對比普通的GA 算法與本文所提的GA -PP,GA 在迭代過程中始終難以收斂,并且存在較大波動,但相較Random 而言更能得到一個較好的解,而GA - PP由于在迭代過程中保留了種群精英,能在較少的迭代輪次下收斂到一個更優(yōu)的解,編排得到的服務鏈Value 值基本可以收斂到0.90 附近。

圖5 Arrangement(10,64) 問題在不同韌性階段的表現情況
(2) 不同候選組件數下的算法表現
圖6 描述了在不同問題規(guī)模下三種算法的表現情況,本文在服務鏈長度n 為10 的條件下,分別選取候選組件數m 的值為16,32,64,128,256,取四個階段編排結果Value 值的平均值作為對比指標,考察三種算法在五種不同候選組件數情況下的表現情況。
由圖6 可以觀察到,三種算法中GA-PP 始終比另外兩種算法有更好的表現,利用GA-PP 算法來解決本文所提的編排問題可以得到更加優(yōu)化的結果,即獲得更能滿足用戶需求的服務鏈。此外,根據圖6顯示可以發(fā)現,候選組件數量的變化并未對算法結果產生太大干擾,不直接影響服務鏈Value 值的計算。

圖6 不同問題規(guī)模下三種算法的表現情況
(3) 不同服務鏈長度下的算法表現
圖7 描述了不同服務鏈長度下三種算法的表現,本文在每個微服務候選組件數m 的值為16 的情況下,分別選取服務鏈長度n 的值為2,3,5,10,15,取四個階段編排結果Value 的均值作為對比指標,考察三種算法在五種不同服務鏈長度情況下的表現情況。
根據圖7 可以觀察到,總體上來看,GA -PP 始終比另外兩種算法有更好的表現,利用GA-PP 算法來解決本文所提的編排問題可以得到更加優(yōu)化的結果。此外,根據圖7 顯示可以發(fā)現,隨著服務鏈長度的增長,三種算法的表現都隨之下降,可見服務鏈長度n 對Value 值的優(yōu)化計算具有較大影響。原因在于本問題的解空間大小為mn,相較于m 增大給問題規(guī)模帶來的影響,n 的增大將使得問題復雜度的擴張更為劇烈。

圖7 不同長度服務鏈下三種算法的表現情況
本文通過考慮微服務組件所使用的韌性增強技術和所產生的韌性代價,描述了一種基于韌性的微服務編排框架RMOF 。RMOF 充分考慮了系統(tǒng)韌性實現的目標、所面臨的風險以及微服務組件所使用的應對風險的技術,同時使用技術應用給系統(tǒng)帶來的復雜性作為韌性代價,從用戶角度出發(fā),綜合考慮韌性增益和代價進行評估。為解決編排的計算問題,本文提出了一種部分保留的遺傳算法GA-PP,以獲得更好的收斂效果和編排結果。通過本文的框架構建和算法實踐,可以得出以下重要發(fā)現和結論:
(1) 隨著微服務架構的大規(guī)模應用,以及系統(tǒng)韌性的重要性日益突出,構建一套適用于微服務架構下基于韌性的編排框架顯得越來越重要。
(2) 對于開發(fā)者而言,緊貼用戶需求是十分必要的,應該從用戶角度出發(fā),充分考慮用戶需求。
(3) 對于韌性系統(tǒng)的編排問題而言,其解空間爆炸的特性使得問題無法通過一般的搜索算法得到解決,必須借助遺傳算法等啟發(fā)式算法進行解決。
(4) 傳統(tǒng)的遺傳算法對于離散數據存在難以收斂的問題,需要采取其他策略諸如精英保留、精英選擇等,來使得其不斷收斂。