黃 林,楊 軍,徐亮亮
(華北計算技術研究所基礎四部,北京 100083)
“微服務+微應用”架構[1-4]是近年興起的新型應用系統(tǒng)構建模型,具有架構靈活、高內聚、低耦合、有效支持DevOps[5](開發(fā)運維一體化)等新型特征,是有效響應需求靈活多變的新型軟件架構模式,在互聯(lián)網企業(yè)中得到了廣泛應用。
應用系統(tǒng)與完全自由的互聯(lián)網應用相比,除了響應用戶的修改需求,還具備較多的集中管理功能,往往需要以應用系統(tǒng)而非一堆零散的APP形式發(fā)布,經常要求在特定時間集中完成系統(tǒng)全面更新任務,集中更新將會對后臺部署服務器造成集中式壓力,同時會在網絡上造成大量的應用下載流量,這些都需要有創(chuàng)新的系統(tǒng)升級方法。
增量升級已有一些算法被廣泛應用,比如Bsdiff算法[6]、Xdelta3算法[7]等,但是這些算法通常只應用于單個應用的增量升級,在對大型的應用系統(tǒng)進行增量升級時效率低下,當網絡環(huán)境不好時,整體更新時間過長,容易超時導致更新失敗,應用系統(tǒng)發(fā)生頻繁更新時,應用系統(tǒng)更新的塊會比較集中。如何高效查找有差異的更新塊也是急需解決的問題。
本文針對大型應用系統(tǒng)提出一種基于微服務構建模型的應用系統(tǒng)增量更新算法ASIUpdate(Application System Increment Update),通過細粒度分層次的系統(tǒng)劃分,利用二分法有效地將大型應用系統(tǒng)進行分解,有利于準確增量更新,提高增量升級效率。一般情況下,程序修改是局部性的,版本的升級只會影響其中的一部分,大型系統(tǒng)進行分解后,每個局部會變得很小,增量升級的對象也很小,效率會提升很快。利用空間局部性原理[8],采用標記每次發(fā)生變化的功能塊的方法,減少頻繁更新時查找塊的時間。
一個功能完善、實用、擴展性良好的應用系統(tǒng)[9]按照職能管理劃分應該包括以下7個子系統(tǒng)(如圖1所示):生產管理子系統(tǒng)、供應管理子系統(tǒng)、市場銷售子系統(tǒng)、財務管理子系統(tǒng)、人力資源子系統(tǒng)、設備管理子系統(tǒng)、高層決策子系統(tǒng)。
圖1 應用系統(tǒng)構成
典型的應用系統(tǒng)EAI構建模型[10]包含應用集成框架、圖形化集成開發(fā)工具、流程管理器、監(jiān)控管理工具、統(tǒng)計分析工具等組件,其模型結構如圖2所示。
圖2 應用系統(tǒng)EAI模型
應用系統(tǒng)EAI模型不利于細粒度地對應用系統(tǒng)進行區(qū)塊劃分,而基于微服務的應用系統(tǒng)構建模型,通過細粒度分層次的系統(tǒng)劃分,可有效地解決大型應用系統(tǒng)的復雜性。本文基于微服務架構的應用系統(tǒng),結合傳統(tǒng)的CS架構模型可分為服務端和客戶端進行描述:
1)服務端。如圖3所示,業(yè)務系統(tǒng)下包含云服務,云服務下包含微服務,微服務再是服務集群。
圖3 服務端
服務端將微服務進行分組,每組微服務對應多個微應用構成云服務,微應用[11]針對同業(yè)務開發(fā)小型系統(tǒng),提供更靈活、更個性化、更快速響應、更具可擴展性的服務,也更方便第三方開發(fā)商的接入。這些微服務運行在服務集群上,而這種云[12]是基于“云計算”[13-14]技術,通過使用計算分布在大量的分布式[15-17]計算機上,而非本地計算機或遠程服務器中,實現(xiàn)各種終端設備之間的互聯(lián)互通。用戶享受的所有資源、所有應用程序全部都由一個存儲和運算能力超強的云端后臺來提供。服務集群則是將很多服務器集中起來一起進行同一種服務,在客戶端看來就像是只有一臺服務器,集群可以利用多個計算機進行并行計算從而獲得很高的計算速度,也可以用多個計算機做備份,從而使得任何一個機器出現(xiàn)了故障整個系統(tǒng)還是能正常運行。
2)客戶端。如圖4所示,業(yè)務系統(tǒng)下包含子系統(tǒng),子系統(tǒng)下包含應用,應用表現(xiàn)為二進制文件。
圖4 客戶端
客戶端以子系統(tǒng)的形式展現(xiàn)給用戶,這里的端為客戶提供本地服務的程序,除了一些只在本地運行的應用程序之外,一般安裝在普通的客戶機上,需要與服務端互相配合運行。而子系統(tǒng)則是包含很多應用的一個集合。子系統(tǒng)的行為由它所包含的應用提供,子系統(tǒng)實現(xiàn)一個或多個接口,這些接口定義子系統(tǒng)可以執(zhí)行的行為。
服務端和客戶端可以用集合來表示:
S={CS1, CS2, CS3, …, CSn}
CS={a1, a2, a3, …, an}
其中:S表示整個應用系統(tǒng)由子系統(tǒng)CS1, CS2, CS3, …, CSn構成的集合,單個子系統(tǒng)CS也是集合,由應用a1, a2, a3, …, an組合而成。
基于微服務的應用系統(tǒng)構建模型有利于對應用系統(tǒng)進行合理的區(qū)塊劃分,方便拆分成塊進行增量更新。
一個大型復雜軟件應用拆分成多個微服務組成,系統(tǒng)中的各個微服務可被獨立部署,各個微服務之間是松耦合的,每個微服務僅關注于完成一件任務并很好地完成該任務,在所有情況下,每個任務代表著一個小的業(yè)務能力。ASIUpdate算法經過對基于微服務應用系統(tǒng)構建模型,將應用系統(tǒng)進行細粒度的分層區(qū)塊劃分,拆分成多個子系統(tǒng),再對子系統(tǒng)進行拆分成多個應用,通過外置描述文件找出差異的應用,最后對差異應用采用增量升級算法,通過外置描述文件記錄各區(qū)塊及分層的詳細信息,有利于適宜地使用差分算法。
當應用系統(tǒng)發(fā)生頻繁的版本更新時,應用系統(tǒng)更新的塊會比較集中,在查找有差異的更新塊的過程中,根據(jù)空間局部性原理,當應用系統(tǒng)的某一塊發(fā)生更新時,在下一個版本中,其附近的塊也會很快發(fā)生更新,將每次發(fā)生更新的塊記錄到外置描述文件中,有利于下一次更新更快地找出差異的塊。
Bsdiff算法是對整個二進制大文件進行無差別的二進制比對,而本文所采用的基于微服務應用系統(tǒng)構建模型的ASIUpdate算法,先通過二分法將大型系統(tǒng)進行大塊分層次分解,然后對分解后的小塊做比對。
圖5 ASIUpdate算法的原理
圖5所示為ASIUpdate算法原理:圖5(a)是舊版本的應用系統(tǒng),包含4個子系統(tǒng)(每種顏色代表的區(qū)域代表一個子系統(tǒng)),每個子系統(tǒng)都包含多個應用(每一個小方塊代表一個應用);圖5(b)是新版本的應用系統(tǒng),與舊版本應用系統(tǒng)的區(qū)別在于有3個子系統(tǒng)都各有一個應用(白色區(qū)域)有版本更新;圖5(c)和圖5(d)為舊版本與新版本應用ASIUpdate算法先找出各個子系統(tǒng)中不同MD5值對應的塊,即有更新的應用,然后對這些塊進行差值處理,從而產生整個應用系統(tǒng)新舊版本之間的差異包;圖5(e)為舊版本和新版本即對新舊版本系統(tǒng)各個子系統(tǒng)中差異的應用采用Bsdiff算法生成差異包patch;圖5(f)則是最終對整個系統(tǒng)進行差異產生的系統(tǒng)差異包,其大小只包含有差異應用的差異包大小之和,即圖5(f)中有色的塊大小,最終的升級只需下載該差異包與舊版本的應用進行結合產生新的差異包進行升級,而無需下載圖5(b)中整個新版本應用系統(tǒng)。
ASIUpdate算法主要分為6步,具體步驟如圖6所示。
圖6 ASIUpdate算法流程
1)劃分系統(tǒng)。將系統(tǒng)以不同的功能模塊按照基于微服務的應用系統(tǒng)構建模型進行劃分為相應的子系統(tǒng)branchSystem[],從而達到實用、擴展性好的效果。
2)找出差異子系統(tǒng)。通過外置的描述文件(如MD5)值,找出差異的子系統(tǒng)。
3)劃分子系統(tǒng)。將子系統(tǒng)再利用基于微服務的應用系統(tǒng)構建模型劃分應用app[],每個子系統(tǒng)里面的應用都有類似的功能或者屬于同種類型。
4)找出有差異的應用。以區(qū)塊劃分的機制,通過外置的描述文件(如MD5)值,而非生硬地作二進制比較,找出有版本差異的應用diffApp[]。
5)處理差異的應用。對應用采用單元級增量算法,生成差異包。
6)合并成子系統(tǒng)差異包。將有差異的子系統(tǒng)中應用差異包按同一層合并成子系統(tǒng)差異包,并將有差異的塊記錄到子系統(tǒng)的外置描述文件中,方便下次更新采用局部性原理。
7)合并成應用系統(tǒng)。將子系統(tǒng)差異包再按同一層合并成應用系統(tǒng)差異包。
上述應用系統(tǒng)增量升級算法的關鍵在于通過描述文件的信息快速定位到有版本差異的子系統(tǒng),然后通過描述文件對應用信息的記錄,找出有變動的應用,對這些有變動的應用采用差值算法生成差異包。
在步驟4、步驟5中關鍵算法的偽代碼實現(xiàn)如下:
diff(oldApps, newApps, patchApps){
for i←0 to oldApps.len do
begin
if oldApps[i].MD5 <> newApps[i].MD5 then
Diff.gendiff(oldApps[i].path, newApps[i].path, patchApps[i].path);
end;
}
時間效率上相對于整體差異的效率提升百分比為t。
1)傳統(tǒng)的應用系統(tǒng)全部重裝的算法;
2)應用系統(tǒng)整體Bsdiff的算法;
3)本文實現(xiàn)的ASIUpdate算法。
同樣的應用系統(tǒng)發(fā)布的2個版本,新版本比舊版本只有較微小的改動,只涉及少量的應用有變化。與Bsdiff算法作比較的原因在于其對單個文件進行增量升級應用廣泛,比較的核心點在大型應用系統(tǒng)整個增量升級過程中的效率和時間上。
測量指標有:
1)系統(tǒng)更新時間:客戶端日志記錄。
2)網絡傳輸量:使用網絡監(jiān)控工具。
實驗平臺是利用Java開發(fā)環(huán)境與Eclipse集成開發(fā)環(huán)境,與平臺無關。
子系統(tǒng)中應用程序包大小的實驗數(shù)據(jù)如表1所示,柱狀圖如圖7所示。
表1 應用新舊版本及差異包大小 /MB
名稱舊版本大小新版本大小差異包大小APACHE_TOMCAT_Noarch_325.88.04AGENT_BASE_Noarch_3223230.149JAVA_JDK_Noarch_32138168163
圖7 應用新舊版本及差異包大小對比
從圖7的數(shù)據(jù)中可以看出patch包相對于新版本包大大減小。
系統(tǒng)整體采用Bsdiff與本文的部分差異算法ASIUpdate消耗的時間的實驗數(shù)據(jù)如表2所示,對比柱狀圖如圖8所示。
表2 系統(tǒng)整體Bsdiff與部分差異算法ASIUpdate消耗時間 /ms
名稱全量Bsdiff算法消耗的時間ATUPdating算法消耗的時間APACHE_TOMCAT_Noarch_322600026500AGENT_BASE_Noarch_322400400JAVA_JDK_Noarch_329800099800
圖8 系統(tǒng)整體BsDiff與部分差異算法ASIUpdate消耗時間對比
從圖8的數(shù)據(jù)中可以看出,當拆分的塊有更新時,本文實現(xiàn)的部分差異算法ASIUpdate消耗的時間比系統(tǒng)整體BsDiff消耗的時間略大,但是沒有變化的塊基本不消耗時間,對于一組微服務整體的升級過程中,往往只有某些塊發(fā)生變化,大大縮短了增量升級過程的時間。
全量升級與增量升級所消耗的時間實驗數(shù)據(jù)如表3所示,對比柱狀圖如圖9所示。
表3 全量升級與增量升級所消耗的時間實驗數(shù)據(jù) /ms
名稱全量Bsdiff算法消耗的時間ATUPdating算法消耗的時間APACHE_TOMCAT_Noarch_321000600AGENT_BASE_Noarch_3220000JAVA_JDK_Noarch_32160008000
圖9 全量升級與增量升級所消耗的時間實驗數(shù)據(jù)對比
從圖9的數(shù)據(jù)中可以得出,增量升級相對于全量升級消耗的時間顯著降低。
實驗數(shù)據(jù)的結果表明:本文提出的應用系統(tǒng)級更新算法ASIUpdate,可以有效提升效率。
本文提出的基于微服務構建模型的應用系統(tǒng)增量更新算法ASIUpdate,對大型應用系統(tǒng)進行塊級更新,采用空間局部性原理,通過外置描述文件記錄塊的詳細信息,測試數(shù)據(jù)表明,可有效解決大型應用系統(tǒng)更新過程中的單一升級不穩(wěn)定性問題,有效降低數(shù)據(jù)傳輸量、顯著提升系統(tǒng)更新速度,尤其在系統(tǒng)頻繁更新的情況下,可快速找到有差異的塊,對于大型應用系統(tǒng)快速迭代更新、系統(tǒng)快速生成起到有效的技術支撐作用。
[1] Lewis J, Fowler M. Microservices[EB/OL]. https://www.martinfowler.com/articles/microservices.html, 2014-03-25.
[2] 米沃奇. 深度剖析微服務架構的九大特征[J]. 電腦知識與技術:經驗技巧, 2016(10):105-110.
[3] Walraven S, Truyen E,Joosen W. Comparing PaaS offerings in light of SaaS development[J]. Computing, 2014,96(8):669-724.
[4] 郭棟,王偉,曾國蓀. 一種基于微服務架構的新型云件PaaS平臺[J]. 信息網絡安全, 2015(11):15-20.
[5] 鄒筱菁,柯林. 基于DevOps的軟件開發(fā)管理模式[J]. 數(shù)字技術與應用, 2016(11):184-187.
[6] Stolikj M, Cuijpers P J L, Lukkien J J. Efficient reprogramming of wireless sensor networks using incremental updates and data compression[C]// 2013 IEEE International Conference on Pervasive Computing and Communications Workshops(PERCOM Workshops). 2012:584-589.
[7] 夏棋. 移動互聯(lián)網增量數(shù)據(jù)差分更新算法研究[D]. 成都:電子科技大學, 2014.
[8] 劉巍. 基于空間局部性的PCM和DRAM混合內存頁面調度算法[J]. 中國科技論文, 2014,9(1):53-57.
[9] 趙琳,張黎明. 基于SOA架構的企業(yè)應用系統(tǒng)研究[J]. 太原理工大學學報, 2007,38(6):535-539.
[10] 過立新. 一種新型企業(yè)應用系統(tǒng)EAI模型的構建[J]. 電子科技, 2006(11):72-76.
[11] 《中國金融電腦》編輯部. PWorld2015:聚焦互聯(lián)網+,助力“大平臺+微應用”[J]. 中國金融電腦, 2015(7):96.
[12] 陳全,鄧倩妮. 云計算及其關鍵技術[J]. 計算機應用, 2009,29(9):2562-2567.
[13] 王意潔,孫偉東,周松,等. 云計算環(huán)境下的分布存儲關鍵技術[J]. 軟件學報, 2012,23(4):962-986.
[14] 盧小賓,王濤. Google三大云計算技術對海量數(shù)據(jù)分析流程的技術改進優(yōu)化研究[J]. 圖書情報工作, 2015,59(3):6-11.
[15] 魏青松. 大規(guī)模分布式存儲技術研究[D]. 成都:電子科技大學, 2004.
[16] 劉亞. 基于MooseFS分布式存儲策略的研究與實現(xiàn)[D]. 濟南:山東大學, 2015.
[17] 吳思. 容錯分布式存儲系統(tǒng)擴容機制研究[D]. 合肥:中國科學技術大學, 2016.