天天看點

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

本文首先向大家介紹阿裡java容器的發展曆程,整個java容器從開始到現在經曆了哪些階段,接着給大家分享目前java容器的基礎架構,最後與大家探讨經過這樣的改變之後,它能夠完成的一些高階的特性,比如合并部署和多版本部署等對于我們的效率提升有明顯的幫助的技術。

以下為整理内容:

阿裡java容器的發展曆程

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

阿裡巴巴在開始階段,就像普通的網站一樣,通過前端的http的流量進來完成資料庫的查詢、調用,然後把資料回報回去。當網站變得很大的時候,不能再像過去一樣,隻是通過單個系統就能夠完成多個業務功能,我們需要把系統做拆分,服務化就是必由之路,java容器誕生于服務架構的編寫過程中,随着階段不斷的向前演進,陸續接入了很多其它的中間件,整個過程更新非常便利,直接替換部署的目錄即可完成更新。阿裡系發展迅猛,我們也将面臨一些挑戰,比如網站的鍊路越來越長,調用錯綜複雜,怎樣通過應用容器的部署方式的改變使我們的性能提升,這是容器需要考慮的問題。

容器架構

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

java容器的标準架構如圖所示,在應用容器tomcat基礎上,我們抽象出一套java容器,可以了解為在tomcat中的一個固定子系統,在這個子系統中,我們會切割出兩塊内容,一是容器,一是插件,服務架構、消息元件、配置元件等都是按照标準的方式接入進去,都被封閉在自己的類加載器中,不會和應用之間産生沖突,這樣就使得各個中間件的發展不會受制于其它中間件版本的選擇。同時,容器會提供這些插件标準的部署方式、生命周期和事件體系,使得中間件的起停能夠被我們所控制,這些中間件能夠知道應用的上下線的一些過程,使得整個中間件和應用的關系變得更加自然。任何的插件都可以輕松的接入到整個容器體系中,把這些能力帶給應用。

<b> </b>

合并部署

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

橫軸代表規模,縱軸代表部署複雜度,部署複雜度其實是人為造成的,使用者可能把公司内部的應用割裂成多個,每個需要完成不同的工作,這種邏輯應用數量的上升必然會造成部署複雜度會變得很高。當應用變得複雜後,公司的業務提升了,就會引入服務的概念,我們需要把不同的業務進行拆分,機器數量就會相應變多,應用數也會增加。使用者依然去通路頁面,但可能穿過很多系統,這就需要遠端調用,遠端調用把兩個系統進行連接配接去滿足使用者的請求,這樣的結構确定後,它的規模會不斷的向上攀升,會變得更加複雜,使用者請求會随着網站規模的不斷擴大,導緻使用者的請求離實際的資料源越來越遠,遠端調用在任何一個點都是不可靠的,使用者在這個過程中承擔的失敗的機率會越來越高,通路的速率會越來越慢。

那麼,怎樣改變這個狀況呢?我們可以在部署時利用java容器把不同的應用部署在一起,是否會有效果呢?

<b>确定優化路徑</b>

我們的核心鍊路是确定的,不論你的網站多大,真正使用者去通路的系統的某一個功能是非常火熱的,在核心鍊路中熱點也是已知的,最關鍵的是我們的流量入口是固定的,<b>從流量入口下手,優化核心鍊路中的熱點線路。</b>

<b>核心鍊路上強相關的多應用部署</b>

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

左側是傳統的樣方式,前台應用、服務應用a和服務應用b都是通過遠端調用來連接配接的。多應用部署的方式就是把這些在開發帶是不同隔離的應用在部署時放在同一個jvm去做,放在一起後就把整個系統的遠端調用轉化成本地調用,這個過程就是服務架構能夠根據java容器提供的資訊完成調用方式的轉變,把不同的強關聯的應用部署在同一個java容器裡,使得整個流程更加的順暢。

<b>遠端調用轉本地調用</b>

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

容器提供給服務架構目前部署的應用資訊,調用時“查表”,當進行調用時,首先看調用的服務在本地是否有另外一個應用提供,如果有則不進行網絡調用,直接把對應參數進行轉移完成本地調用;如果沒有,就從遠端随機選一個位址發起遠端調用。本地調用需要進行“深拷貝”。

<b>“深拷貝”</b>

我們需要将我們去請求一個應用的參數轉化成另外一個類加載器能消化的資料,同時要把回報回的資料消化成本加載器能夠了解的資料,這個過程稱為深拷貝。

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

深拷貝的性能對比可以看出,深拷貝的耗時平均隻有hessian的15%,并且沒有統計網絡開銷。面對越來越大的資料結構,深拷貝的優勢會愈加明顯。

<b>合并部署的效果</b>

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

越來越多的通路資料來自于無線,可以看出qps提升超過50%,資料越大提升越發明顯。合并部署後性能衰減不是很明顯,趨勢非常柔性。

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

實際情況來看,rt下降了50%,毛刺基本消失,鍊路更加平穩。

<b>合并部署帶來了什麼</b>

合并部署技術降低了成本,使相同的機器提供更大的數車,不需要增加機器。成本的降低也就意味着性能的提升,rt下降明顯。

多版本部署

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

釋出的本質即重新開機,那麼,能不能不重新開機就釋出呢?運用多版本部署方式能夠避免使用者進行重新開機。将兩個版本的應用都部署到容器中後,對外提供服務的連結是不斷的,對外提供的http流量、tomcat流量是不變的,遠端服務架構、消息處理也是不變的,當外界給予切流指令的時候,就把對應的舊版本的處理邏輯向新有版本進行躍遷,就完成對應版本的釋出了,整個過程是非常流暢、柔性的。

<b>事件體系</b>

如果高次元的元件不去釋放掉對應的應用和擴充,對應的應用資源就沒有辦法釋放,同一個應用的多個版本都在一個機器上運作着,此時我們通過事件體系來解決這個問題。

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

通過響應事件來釋放資源,事件類型有:應用部署事件、應用退部署事件、流量關閉事件、流量開啟事件。

容器不僅提供了多應用的部署能力,同時把事件做了一定的統一的抽象,事件能夠直達所有的中間件,所有的中間件都會去響應容器釋出的事件,我們會告訴所有中間件,某個應用上線了或者下線了,流量開始進入或者切出應用,這些事件的發送,使得中間件可以從容的響應所有的變更。

<b>多租戶</b><b>jvm</b>

java容器能夠做到類型隔離,卻做不到資源隔離,我們需要完成對應的資源的隔離,cpu、記憶體、i/o帶寬等都需要隔離。怎麼辦呢?

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

阿裡特有的多租戶jvm,支援多租戶部署的alijdk,包含多租戶api,創造一個獨立的容器,在這個容器裡面的資源是隔離的,在這個隔離的區域縱使出現記憶體洩漏,也不會影響到另外一個區域,在這個區域運作的cpu的消耗也不會影響到另一區域對應的執行邏輯,這就完成多版本部署裡的資源隔離需要使用的技術。

【阿裡線上技術峰會】魏鵬:基于Java容器的多應用部署技術實踐

依靠tenant做到資源隔離。

context對應webapp

tenant中建立context

銷毀context時銷毀tenant

<b>多版本部署帶來了什麼</b>

釋出速度非常快:實作了全量釋出,自由切流。

秒級復原:舊版本暫時不下線,極速復原。

總結與展望

多應用部署是我們在應用部署方式和思考次元的改變。

通過合并部署把鍊路上強相關的應用進行部署後,使得性能有所提升。

多版本部署與釋出提速。

子產品化應用的支援。

高密度部署。