高德渲染網(wǎng)關Go語言重構(gòu)實踐
時間:2021-09-06 15:19:06
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]1.導讀高德啟動Go業(yè)務建設已經(jīng)有段時間了,主要包含Go應用落地,Go中間件建設,云原生三個部分。經(jīng)過持續(xù)的發(fā)力,在這些方面取得了不錯的進展。高德Go業(yè)務落地過程是如何實現(xiàn)的,遇到過哪些問題,如何解決?本文將為大家介紹相關經(jīng)驗,希望對感興趣的同學有所幫助。2.高德為什么要落地Go...
1.導讀
高德啟動Go業(yè)務建設已經(jīng)有段時間了,主要包含Go應用落地,Go中間件建設,云原生三個部分。經(jīng)過持續(xù)的發(fā)力,在這些方面取得了不錯的進展。高德Go業(yè)務落地過程是如何實現(xiàn)的,遇到過哪些問題,如何解決?本文將為大家介紹相關經(jīng)驗,希望對感興趣的同學有所幫助。
2. 高德為什么要落地Go應用
現(xiàn)在高德內(nèi)主流的語言還是Java,Java應用最多,機器數(shù)十分驚人。而且高德整體業(yè)務也在快速向前奔跑,成本增加的速度非常快。在減少機器負載方面,Go語言在語言級別對Java語言有相當優(yōu)勢。減少機器成本是我們落地Go應用的第一個考慮因素。
其次,Go語言近幾年發(fā)展勢頭迅猛,不論是阿里集團內(nèi)部,還是在高德內(nèi)部,對使用Go語言的呼聲越來愈高。落地Go應用可以很好的驗證Go中間件的穩(wěn)定性。當然我們可以通過混沌工程等手段去驗證,但經(jīng)過生產(chǎn)環(huán)境考驗才最具有說服力。驗證沉淀Go語言中間件穩(wěn)定性是我們落地Go應用的第二個考慮因素。
最后,Go語言作為云原生基礎框架使用較多的語言,提前落地Go應用,對后續(xù)落地云原生可以減少不少阻力。高德目前落地的Serverless/Faas規(guī)模相當大。落地Go應用的第三個考慮因素是為后續(xù)云原生落地鋪路。
3. 大流量場景Go應用落地
3.1 渲染網(wǎng)關介紹
本文所述中提到的高德渲染網(wǎng)關,是我們落地的Go應用中業(yè)務流量、改造難度、風險,收益均處前列的應用。渲染網(wǎng)關在接入層,占高德總流量的一半,重要性可想而知。接下來簡要介紹下渲染網(wǎng)關承接的業(yè)務,方便大家有一些更立體的認識。
渲染網(wǎng)關承接高德手機App、車機、開放平臺等來源所有的圖面渲染。大家在使用高德時,看到的建筑物、地形圖、名稱、路線、地鐵站、公交站、紅綠燈等等所有圖面,都是由渲染引擎通過渲染網(wǎng)關透出到端。下面放幾張圖,方便大家有一些更感性的認識。

上面圖一為行前,圖二為行中,圖三為打車頁面,圖四為景區(qū)手繪圖。渲染網(wǎng)關涉及業(yè)務眾多,以上僅為舉例,其他業(yè)務就不在這里貼圖了。
3.2 重構(gòu)難點
做過重構(gòu)項目的同學相信都深有體會,重構(gòu)項目中最大難點有二,一是要保證業(yè)務正確性,二是要保證服務穩(wěn)定性。對于保證業(yè)務正確性,一般來說,重構(gòu)的服務大多數(shù)為老服務,老服務面臨的最大問題是歷史邏輯復雜,人員更迭,文檔缺失,這些因素都是重構(gòu)過程中的“攔路虎”。
渲染網(wǎng)關重構(gòu)同樣如此,它涉及高德手機端、車機端、開放平臺、打車等各個業(yè)務線,所有的歷史版本,再加上上述因素,所以保證業(yè)務正確性是一件非常困難的工作。
對于保證服務穩(wěn)定性,做過網(wǎng)關的同學應該都知道,網(wǎng)關本身的屬性就決定了它并不會有頻繁的業(yè)務迭代,穩(wěn)定性是網(wǎng)關的第一訴求。我們要保證,無論外部環(huán)境/依賴是否正常,網(wǎng)關始終能保持高可用。由于Go版本中間件缺乏在大流量場景的充分驗證,這一難點需要仔細評測,用合適的方法和手段,盡可能的在仿真環(huán)境里驗證各種邊界情況,從而保證在生產(chǎn)環(huán)境不出問題。
3.3 技術方案
在重構(gòu)高德渲染網(wǎng)關時,我們整體技術方案分三大步走:
3.3.1 線上流量對比
如何驗證新服務的業(yè)務正確性呢?我們采用了線上流量對比的方式。我們前期做了大量調(diào)研,希望找到一個滿足(近)實時,二進制級對比的工具,但可惜并沒有找到一個滿足要求的工具。由于渲染業(yè)務的特殊屬性,渲染網(wǎng)關絕大多數(shù)接口返回的是二進制矢量數(shù)據(jù),所以理想的工具不僅要能支持常規(guī)數(shù)據(jù)對比,也要能支持二進制級對比。
二進制級對比的另一個好處是,可以排除字符集差異,不同語言庫函數(shù)差異。更能保證對比的準確性。有些同學可能會想到打日志,然后離線讀取比較的方式來做對比,這種方式有很多弊端。
首先,流量無法重放至指定機器。其次,這種使用方式一般為固定語料,語料完整度不夠,不能完全模擬線上環(huán)境。此外,打日志對比帶來的字符集和語言庫函數(shù)差異,會對比較準確性有較大影響,特別是對于特殊字符(當7層協(xié)議為二進制協(xié)議時更加明顯)。沒有現(xiàn)成的稱手工具,怎么辦?"逢山開路,遇水搭橋"。
我們自主研發(fā)了一款(近)實時流量對比工具,它保障了此次重構(gòu)的業(yè)務正確性,并且還能服務于高德其他業(yè)務的重構(gòu)。其技術細節(jié)對TCP/IP涉及較多,非常有意思,感興趣的同學可以直接跳至《流量對比工具(ln)技術細節(jié)》一節(jié)。
3.3.2 仿真環(huán)境壓測
做服務的同學相信都深有體會,想讓服務保障做到5個9的可用性并不是一件容易的事。真實生產(chǎn)環(huán)境中可能會出現(xiàn)各種情況,我們要想辦法驗證各種邊界情況下服務的穩(wěn)定性,才能保障服務高可用。對于重構(gòu)完成的新服務,更需要一個仿真環(huán)境,進行各種情況驗證。構(gòu)建仿真環(huán)境,我們需要保持機器基線、外部依賴、外部流量均一致(比如從線上引流)。仿真環(huán)境不僅要提供正常態(tài)環(huán)境的能力,更要能提供異常態(tài)環(huán)境的能力。
異常態(tài)包括斷網(wǎng),網(wǎng)絡丟包等等。有句話說的好:20%的代碼完成功能,80%的代碼來處理各種異常情況。我們在實踐中構(gòu)建異常態(tài)的主要手段為混沌工程,通過混沌工程模擬下至操作系統(tǒng)級的異常(如斷網(wǎng),丟包等),上至應用層的異常(如消息中間件積壓,JVM方法前后Hook模擬業(yè)務異常等等)。
在仿真環(huán)境里,同時進行長時間極限壓測,語料從線上導流,壓測在正常態(tài),異常態(tài)均進行,觀察服務在一段較長時間內(nèi)的表現(xiàn),從而得出服務的穩(wěn)定性,可用性結(jié)論。
觀測指標包括基礎指標,例如CPU、磁盤利用率、內(nèi)存利用率、連接數(shù),以及業(yè)務指標,例如業(yè)務接口成功率、成功量、總量、TP99。通過這種方式,基本上完全覆蓋了可能出現(xiàn)各種情況,充分保證了服務穩(wěn)定性和高可用。
3.3.3 平滑灰度切流
前邊講了如何保證業(yè)務正確性和服務穩(wěn)定性。接下來說說如何保證平滑灰度切流。牢牢遵守阿里發(fā)布三原則是平滑灰度切流的“法寶”:可灰度,可監(jiān)控,可回滾。在具體實踐中,我們按照如下步驟灰度切流:
a. 原Java集群不動,新申請一套Go集群。修改路由規(guī)則,部分白名單用戶使用Go集群服務。
b. 逐個接口修改路由規(guī)則至Go集群,慢慢灰度,期間密切觀察機器姿態(tài),業(yè)務日志,監(jiān)控指標。如有異常一鍵切回至Java集群。
c. 接口全量切至Go集群后,Java集群/Go集群同時共存一段時間。
d. 逐漸下掉Java集群機器。
3.4 主要收益
第一個重要收益:降本提效。高德渲染網(wǎng)關由Java換成Go語言之后,機器數(shù)減少近一半。用原來一半的資源完成了相同的工作,大大降低了成本,提高了資源利用率,更好支持了業(yè)務發(fā)展,大大降低了業(yè)務流量快速增長帶來的接入層機器增長速度。第二個重要的收益是:驗證了高德與集團合作共建的Go版本中間件的穩(wěn)定性,一定程度上完善繁榮了集團Go生態(tài)。在大流量場景考驗過后,高德與集團合作共建的Go版本中間件穩(wěn)定性得到了相當充分的驗證。
第三個重要的收益是:為網(wǎng)關云原生化鋪路。網(wǎng)關Go化只是第一步,Go是云原生基礎設施實現(xiàn)使用較多的語言,第一步抹平語言差異,對于網(wǎng)關后續(xù)云原生化,好處多多,可降低改造風險和成本。
當然,高德渲染網(wǎng)關重構(gòu)過程中還有許多非常有用的工具沉淀??蔀楹罄m(xù)業(yè)務重構(gòu)提供關鍵性保障,比如自研的流量對比工具ln。
4. 技術干貨
4.1 流量對比工具(ln)技術細節(jié)
先提一個問題,做一款(近)實時流量對比工具需要完成哪些功能?沒錯,就是流量復制,流量解析,流量重放,流量比對。其實不止這些,在實踐中更多是一個流量回歸閉環(huán),如下圖:
4.1.1 流量復制
為了支持所有的7層協(xié)議,流量獲取必須從3層或4層開始。有同學會立馬想到tcpdump。沒錯,就是tcpdump。tcpdump出的文件就是實實在在的流量。復制流量這一步已經(jīng)有著落了,至于實時,可以兩到三個進程錯開時間,時間段首尾互相重疊即可完成實時。另外,設計此工具的另一個考量點是,對線上機器不能有太重的負載,避免對線上機器產(chǎn)生穩(wěn)定性影響。此種流量復制方式非常輕量,對線上機器增加的負載非常小,可以忽略不計。