DigiRunner hot deployment hot deploy ClassLoader zero downtime

DigiRunner如何完成module的zero downtime熱部署及其優點

林政儀 2020/05/22 15:05:09
168

前言

      傳統java開發web程式基本上都是基於servlet撰寫,因此會打包成war(或ear)部署在AP server(tomcat, jboss, ...)上運行。然後修改bug、新增功能要更換war時必須先卸載舊的war然後上傳新的war進行部署,這中間的downtime不說,在cluster環境下需依賴繁瑣設定(企業級AP Server才有提供, 例如jboss)才能確保每個AP Server都部署了新的war,又或者新的war載入失敗要趕快切回上一版war等等諸如此類的問題,都讓每次換版都像極限運動!

      而DigiRunner就像一個AP Server且一口氣解決了這些問題,它主要是依賴DB解決cluster同步問題,然後依賴昕力專利【具有軟體在線部署服務管理平台的電腦系統】及【多軟體模組可熱抽換之電腦程式產品及方法以及裝置】達到zero downtime熱部署行為。只要在後臺管理畫面上選擇部署哪個module(war)在那些node上,整個cluster就會同步作業,在module(war)版本切換間完全沒有downtime,就算新module載入失敗也沒關係,因為新module要載入成功才會上線提供服務。

 

 

 

 

如何做到zero downtime熱部署?

   

      相信大家一定知道vmwarevirtualbox是什麼吧!它們讓一個實體機內可以開多個VM,每個VM上面會有一個OS,OS上可以運行多個服務,而DigiRunner採用了同樣的概念,只是更貼近了docker的容器架構:實體機多個容器每個容器內的OS提供的服務(如左圖)。

      因此每個要提供服務的module(war),DigiRunner就會在同一個jvm(實體機)上虛擬一個ServletContext(容器),然後初始化war內的Spring(OS)(註1),同時帶起module要提供的服務。透過上圖可以很快理解DigiRunner如何管理每一個要載入的module,所以換句話說DigiRunner也就像是一個迷你的Kubernetes(k8s)。

 

      基於上述的管理機制,在熱部署階段就非常簡單了。首先透過規劃洽當的ClassLoader再搭配容器(ServletContext)的操作,就可以於背景先初始化該module(war),待初始化完成後就可以上線提供服務了(開放將request接進該module的ServletContext)。最特別的是若該module在讀取設定檔的部分若未做動態刷新載入的話,DigiRunner可以控制重新熱部署讓module載入新的設定值,而這期間就是zero downtime的熱部署,如下圖示:

      在module loader將載好的新module與ready pool內舊module交換時, 僅會有短暫的暫停時間(<10ms),這感覺有點像是你去超商買東西,剛好遇到店員要交班,你等他們交班完後就可以結帳了(zero downtime),只是這兩個店員會以光速進行交班,讓你感受到無上尊榮的服務!不至於店員不在(404, downtime)你憤而當場吃掉食物離開(消耗了server處理這個request的資源)!

 

這麼做有什麼優點?

 

      那這麼做有什麼優點呢?相信一定會有人有疑問說「這麼麻煩幹嘛,直接使用k8s就好啦!」,但其實這是兩個不同面向的東西,只是在運行服務上類似而已。而在運行服務這個議題上,DigiRunner仍然與k8s有些實質上的差異:

 

1.記憶體用量:DigiRunner的記憶體用量遠低於docker,因為從根本省去了每一個docker跑起來的容器用量,每個module還可以共用java基礎物件(String, Number, ...等等)從而省去一些基礎記憶體消耗。當然,這侷限於java開發的程式,但未來或許能基於GraalVM從而載入其他語言運行也是有可能的!

2.轉導速度:k8s根據request轉導至不同的docker仍需透過硬體再轉過去,但DigiRunner直接在memory裡進行處理即可(因為在同一個jvm裡)。

3.操作難易:k8s雖然能達到zero downtime的換版,但仍需要訓練有素的工程人員才會操作,但DigiRunner僅需在後臺管理畫面上操作,就能控制cluster每個node載入module的狀況!

4.加值功能(API管理):k8s只能管理服務,但無法加值其業務內容。DigiRunner由於在同一個jvm運行,可以直接加值module的API。例如module撰寫時本身不需要關注授權問題,部署至DigiRunner就會直接加上權限控管,只需在後台管理畫面上進行設定即可。除此之外仍有其他許多的加值功能(流量、執行優先權、請求黑白名單、API視覺化、...等等),這些都達成【撰寫業務邏輯的人就真的僅需專注業務邏輯】這個理想狀態喔!其餘的就都交給我們DigiRunner吧!

 

註1:從圖看起來需要熱部署的module一定要基於servlet與spring,但其實程式結構上是允許不同相依基礎的,就像是docker image內打包的OS可以是Linux也可以Windows一樣。只是目前最主流開發框架就是相依servlet的spring的web程式,因此以此為圖示表達而已,但架構上是非常彈性且易擴充的喔!

 

林政儀