如虎添翼|高德地图+Serverless 护航你的假日出行
作者:劉金龍(福辰)? 高德團(tuán)隊(duì)
引言
“前方事故多發(fā)地段,請(qǐng)注意保持車距…”“您已疲勞駕駛,請(qǐng)注意休息…”“前方經(jīng)過泰山旅游景區(qū),中國 5A 級(jí)景區(qū),是第一批國家級(jí)風(fēng)景名勝區(qū)…"? ?…
這是高德出行的導(dǎo)航場(chǎng)景,像這樣暖心的語音提示,在春節(jié)期間的每天都會(huì)有上百億次,以保障您的出行安全。然而這背后,任何系統(tǒng)抖動(dòng)或者故障,都會(huì)影響到用戶的出行安全,所以在節(jié)日期間整個(gè)團(tuán)隊(duì)會(huì)嚴(yán)陣以待并去現(xiàn)場(chǎng)值班,以保障系統(tǒng)的穩(wěn)定性。
在過去的 2021 年,高德地圖提出了新的品牌主張:在“高德地圖,哪兒都熟”的背景下,高德出行 App 增添了更多的用戶使用場(chǎng)景,隨之而來業(yè)務(wù)系統(tǒng)也變得更為復(fù)雜。為了保障系統(tǒng)的穩(wěn)定性,每一個(gè)節(jié)日大促期間,都會(huì)有同事去現(xiàn)場(chǎng)值班。
為了解決這一困境,我們對(duì)系統(tǒng)架構(gòu)進(jìn)行了更深的思考,并一致認(rèn)同 Serverless 會(huì)是未來的技術(shù)趨勢(shì),所以在過去的一年中,我們對(duì) Serverless 技術(shù)做了很多的探索,并實(shí)現(xiàn)了部分核心業(yè)務(wù)的 Serverless 化。利用 Serverless :低成本,免運(yùn)維,高彈性等優(yōu)勢(shì),達(dá)成了上述提及業(yè)務(wù),節(jié)假日無需同事再去現(xiàn)場(chǎng)值班的目標(biāo),讓團(tuán)隊(duì)成員可以在家過一個(gè)安心團(tuán)圓年。
本文會(huì)分享過去的一年,高德地圖在 Serverless 領(lǐng)域做過哪些探索?如何與業(yè)務(wù)相結(jié)合,實(shí)現(xiàn)了一個(gè)低成本,低代碼,免運(yùn)維的現(xiàn)代化的 Serverless 研發(fā)平臺(tái)。
業(yè)務(wù)背景
自 2021 年 7 月,高德地圖宣布品牌履新:整體向 “出門好生活開放服務(wù)平臺(tái)”升級(jí),同時(shí)提出了“高德地圖,哪兒都熟”的新品牌主張。高德地圖從導(dǎo)航工具升級(jí)為出行服務(wù)平臺(tái)、生活信息服務(wù)入口;為了更好地服務(wù)用戶,拓展和出行相關(guān)的生活信息服務(wù)場(chǎng)景:高德地圖主圖、我的頁面、行前行后場(chǎng)景以業(yè)務(wù)卡片的方式,透出了業(yè)務(wù)推薦信息。下圖是高德 App 中出現(xiàn)的幾個(gè)典型卡片推薦場(chǎng)景:
樣式多變
高德地圖的業(yè)務(wù)特點(diǎn)之一是:高頻率的樣式變化。節(jié)日氣氛的襯托、假期旅游的引導(dǎo)、交通信息的提醒等等多變不同的需求下,亟需一種能夠快速迭代的研發(fā)模式。而傳統(tǒng)的研發(fā)模式是:每一個(gè)變化都是在 App 客戶端上研發(fā),然后隨著 App 版本的發(fā)布進(jìn)行樣式再更新。(這種發(fā)版效率很慢,并且要考慮到穩(wěn)定性;每月一個(gè)版本,如果仍使用這種研發(fā)模式,其實(shí)是很難滿足業(yè)務(wù)需求的。)
策略多變
卡片業(yè)務(wù)背后的后端代碼,會(huì)隨著業(yè)務(wù)類型的不斷增加,因此相應(yīng)的業(yè)務(wù)策略越來越多,如果不及時(shí)與系統(tǒng)功能模塊進(jìn)行抽離,就像生命力頑強(qiáng)的爬山虎一樣,系統(tǒng)代碼不斷無序增加,越來越臃腫,復(fù)雜性也越來越高。而多變的策略,會(huì)要求在系統(tǒng)架構(gòu)上做出改變,達(dá)到策略的快速增加與刪除,以及實(shí)時(shí)的生效。
客戶端瘦身
過多的業(yè)務(wù)邏輯糅合到客戶端,雖然可以一定程度上提高性能,但是如果客戶端過大,也會(huì)導(dǎo)致用戶不愿更新。其實(shí)動(dòng)輒幾百兆的更新,不僅會(huì)增加我們的帶寬成本,也占用了用戶的數(shù)據(jù)流量。此外因?yàn)榇a多,相應(yīng)的涉及業(yè)務(wù)也多,如果每一個(gè)業(yè)務(wù)都有快速迭代的要求,這就需要 App 客戶端擁有能夠快頻率的更新的能力。
兩者構(gòu)成了惡性的循環(huán),不利于 App 的長期發(fā)展,所以客戶端瘦身勢(shì)在必行。
早晚峰值
上班早高峰,下班晚高峰,相信大家都有過一致的體驗(yàn):堵 !!同樣地圖導(dǎo)航類應(yīng)用,早晚峰值時(shí)間段非常的明顯,且峰值和低谷的波谷差距非常大,如果所有的機(jī)器資源按照峰值去準(zhǔn)備,這成本無疑是非常高的,在低峰期,會(huì)造成極大的資源浪費(fèi)。所以我們需要能夠按需使用的彈性資源技術(shù),去降低我們的機(jī)器資源成本。
技術(shù)選型
經(jīng)過架構(gòu)組的多輪討論,最終我們并達(dá)成達(dá)成一致目標(biāo):全面擁抱 Serverless。因?yàn)?Serverless 的優(yōu)勢(shì)特點(diǎn),恰好解決了我們的業(yè)務(wù)痛點(diǎn)需求。我們也相信未來一定是屬于 Serverless 的時(shí)代。
Serverless?for?frontend
不用多說,當(dāng)下前端最熱的技術(shù)趨勢(shì)就是:云端一體化研發(fā)模式,它實(shí)際上是以 Serverless 技術(shù)作為技術(shù)底座去構(gòu)建的現(xiàn)代化應(yīng)用研發(fā)模式;不僅降低了“全棧開發(fā)工程師” 的技術(shù)門檻,還大幅提高了研發(fā)效率,阿里內(nèi)部多個(gè)大型 App 都已全量使用,比如淘寶,天貓,飛豬等等。經(jīng)過嚴(yán)格的數(shù)據(jù)統(tǒng)計(jì),Serverless 在研發(fā)提效上能提高 ?38%,這也是我們選擇 Serverless 最重要的數(shù)據(jù)依據(jù)。除此以外,基于 Serverless 實(shí)現(xiàn)的 CSR/SSR 首屏提速技術(shù)方案,目前也已經(jīng)非常的成熟,幾乎覆蓋了阿里內(nèi)部的 App 應(yīng)用。
快速迭代
工程卓越一直是我們的追求目標(biāo),但是由于各大技術(shù)產(chǎn)品關(guān)注重點(diǎn)不同,所以對(duì)于“研發(fā)最后一公里”的相關(guān)事項(xiàng)并沒有做太多關(guān)注,這就導(dǎo)致了技術(shù)產(chǎn)品的功能與用戶體驗(yàn)出現(xiàn)割裂感,很多業(yè)務(wù)方放棄使用。
Serverless 的目標(biāo)就是讓你盡可能多的專注自己的業(yè)務(wù)邏輯,能夠少關(guān)注或者忽略非業(yè)務(wù)核心的運(yùn)維工作;加速開發(fā)時(shí)間,降低線上資源的冗余成本,所以 Serverless 無疑是扛得起降本提效的大旗的。
完全彈性
請(qǐng)求毫秒級(jí)的調(diào)度是 Serverless 的核心競(jìng)爭(zhēng)力,相比傳統(tǒng)的分鐘級(jí)彈性擴(kuò)容,Serverless 技術(shù)存在巨大的成本優(yōu)勢(shì),擴(kuò)容所耗費(fèi)的時(shí)間越少,預(yù)留的機(jī)器資源就會(huì)更低,如果到了毫秒級(jí)別,就無需預(yù)留任何資源,這樣成本能夠大大的降低,資源利用率可以達(dá)到 100%。
低成本遷移利器?-?Runtime/Container
做過程序員的同學(xué)都知道最痛苦的事情是“改別人的代碼”,因此,雖然 Serverless 技術(shù)十分誘人,但是對(duì)于存量的應(yīng)用如何遷移到 Serverless 架構(gòu)上,也一直困擾著我們。
我們應(yīng)如何以低代碼的方式解決傳統(tǒng)架構(gòu)潮汐流量對(duì)資源使用不合理的問題,于是我們跟 Serverless 團(tuán)隊(duì)同和合作開發(fā) Runtime。由于高德的服務(wù)均以 C++、Go、Rust 的語言設(shè)計(jì),于是我們開發(fā)出 C++、Go、Rust 的 Runtime。Runtime 集成了集團(tuán)內(nèi)的中間件,使得 Serverless 架構(gòu)可以滿足我們之前服務(wù)的整個(gè)生命周期。讓我們可以快速的切換服務(wù)到 Serverless 平臺(tái)上。
但是隨著我們使用量變大,業(yè)務(wù)場(chǎng)景比較復(fù)雜,一些對(duì)外的服務(wù)是無法使用內(nèi)部 Runtime 的,這個(gè)嚴(yán)重的問題一直掣肘著我們,使原有的架構(gòu)由簡(jiǎn)單又變得復(fù)雜起來。直到阿里云 Serverless 團(tuán)隊(duì)的同學(xué),推出了 Custom Runimte/Container 功能,徹底解決了我們后顧之憂。我們只需改幾行啟動(dòng)命令,就可以輕松遷移存量的應(yīng)用。Serverless 團(tuán)隊(duì)也針對(duì)鏡像的快速分發(fā)做了大量的創(chuàng)新優(yōu)化工作,如使用四級(jí)緩存,P2P 技術(shù),按需下載等方式,提供了秒級(jí)別下載 3G 大小鏡像的能力。
得益于 Serverless 技術(shù)加持,無人值守的目標(biāo)也就很容易達(dá)成,所有的運(yùn)維操作,都通過 Serverless 的強(qiáng)大調(diào)度能力去解決,比如峰值高峰期,系統(tǒng)會(huì)自動(dòng)毫秒級(jí)別進(jìn)行擴(kuò)容,低峰期同樣也會(huì) Graceful 的進(jìn)行縮容,不涉及任何人為操作運(yùn)維,所以這也解決了我們?cè)诠?jié)日大促期間過多人現(xiàn)場(chǎng)值班的困境。
Serverless?技術(shù)落地
架構(gòu)設(shè)計(jì)
在系統(tǒng)設(shè)計(jì)上,我們引入了兩層 FaaS (Function as a Serverles),端 FaaS 和業(yè)務(wù) FaaS,其中:
-
端 FaaS,也就是 SFF ( Serverless for frontend),基于 Node.js,實(shí)現(xiàn)了端云一體化開發(fā),將原本客戶端的邏輯移到 FaaS 服務(wù)端來。這里在傳統(tǒng)的 Frontend 和 Backend 之間抽象出了 SFF,用來實(shí)現(xiàn)數(shù)據(jù)和調(diào)用邏輯封裝,快速開發(fā)、發(fā)布。
-
在后端,引入業(yè)務(wù) FaaS,基于 Java/Go 實(shí)現(xiàn), 用來封裝推薦策略邏輯和數(shù)據(jù)轉(zhuǎn)換代碼,可以提高策略迭代效率,同時(shí)減少策略迭代對(duì)主工程的影響。
從整體上看,將函數(shù)計(jì)算和容器化微服務(wù)整合在一起,綜合利用函數(shù)計(jì)算的高效和傳統(tǒng)微服務(wù)的靈活,是一種實(shí)用高效的架構(gòu)設(shè)計(jì)思路。
快速迭代
作為核心的應(yīng)用,需要一套完備的 CI/CD 流程去保障應(yīng)用的質(zhì)量,針對(duì)函數(shù)的質(zhì)量,我們基于了 Serverless Devs 工具鏈同樣實(shí)現(xiàn)了一套研發(fā)全流程方案。不僅具備函數(shù)多環(huán)境,函數(shù)灰度切流,函數(shù)可觀測(cè)等能力,而且通過這套 Serverless 研發(fā)體系,我們實(shí)現(xiàn)了 1 分鐘開始進(jìn)入開發(fā),5 分鐘完成上線的能力,同時(shí)默認(rèn)具備異地多活的能力。
限流降級(jí),異地多活
對(duì)于大流量應(yīng)用的穩(wěn)定性,限流保護(hù),降級(jí)預(yù)案,異地多活是三大必備功能。特別是大促的時(shí)候,非預(yù)期的流量都可能引起系統(tǒng)雪崩,在我們的 Serverless 研發(fā)平臺(tái)上,集成了阿里云函數(shù)計(jì)算的并發(fā)度流控,QPS 流控的能力,做到了函數(shù)粒度的流控。
另外一個(gè)亮點(diǎn)是,FaaS 的容災(zāi)方案與傳統(tǒng)應(yīng)用的容災(zāi)方案相比,有著巨大的優(yōu)勢(shì)。在傳統(tǒng)應(yīng)用的容災(zāi)方案中,異地多活需要在備機(jī)房中準(zhǔn)備冗余的機(jī)器資源,這些資源也就是成本,但是在 Serverless 場(chǎng)景下的方案中,因?yàn)槭强焖購椥?#xff0c;秒級(jí)別就能完成資源的準(zhǔn)備,所以無需進(jìn)行資源冗余準(zhǔn)備,這就大大節(jié)省了成本。雖然是三單元,但是成本仍然是一個(gè)單元的費(fèi)用,目前所有核心的函數(shù)應(yīng)用,我們都默認(rèn)實(shí)現(xiàn)了三單元容災(zāi)。
冷啟動(dòng)優(yōu)化
如果你的業(yè)務(wù)對(duì)于冷啟動(dòng)非常的敏感,比如 50 ~ 100 毫秒的延遲增加,你都無法接受的話,不要擔(dān)心,我們?nèi)钥梢酝ㄟ^擴(kuò)容策略進(jìn)行彌補(bǔ):預(yù)留資源來消減冷啟動(dòng)對(duì)業(yè)務(wù)的影響。
-
預(yù)留實(shí)例,根據(jù)產(chǎn)品流量曲線,很容易得出固定流量是多少。這部分流量用“預(yù)留模式”,適合冷啟動(dòng)敏感的業(yè)務(wù);
-
按量擴(kuò)容模式,按用戶設(shè)置的并發(fā)度或者 CPU 利用率閾值進(jìn)行擴(kuò)容,擴(kuò)容中的實(shí)例,不會(huì)立即接收流量,而是實(shí)例 Ready 后再進(jìn)行服務(wù)。所以擴(kuò)容中新增的流量會(huì)仍然派發(fā)到“正在服務(wù)中”的實(shí)例,并不會(huì)觸發(fā)冷啟動(dòng)。
展望
在過去的 2021 年,高德在 Serverless 領(lǐng)域中,做了很多方向的探索,也實(shí)現(xiàn)了部分核心業(yè)務(wù)的 Serverless 化。單在 Serverless 的業(yè)務(wù) QPS 峰值就已經(jīng)超過 40W QPS, 然而這不是終點(diǎn),只是剛剛開始,后續(xù)我們會(huì)全面轉(zhuǎn)向 Serverless 化。比如,地圖數(shù)據(jù)的處理,圖片的栽剪,消息的消費(fèi)等等這些離線的非在線應(yīng)用,它們同樣也是 Serverless 的最佳適用場(chǎng)景,我們期望今后有更多的場(chǎng)景去使用 Serverless,享受 Serverless 給我們帶來的技術(shù)紅利 !
近期熱門
# 極速上手 Serverless #
隨著 Serverless 熱度不斷升高,越來越多人期望在實(shí)際工作中能快速上手。為了讓更多 Serverless 初學(xué)者真正學(xué)會(huì) Serverless 理論知識(shí),在工作中根據(jù)需要靈活應(yīng)用 Serverless 技術(shù),阿里云 Serverless 團(tuán)隊(duì)推出技術(shù)圖譜,本課程包含視頻課、動(dòng)手實(shí)驗(yàn)、電子書、直播、開源項(xiàng)目多種形式內(nèi)容,讓各位開發(fā)者即學(xué)即用,跑步入場(chǎng)享受 Serverless 技術(shù)紅利。點(diǎn)擊??此處??即可學(xué)習(xí)!
總結(jié)
以上是生活随笔為你收集整理的如虎添翼|高德地图+Serverless 护航你的假日出行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AHPA:开启 Kubernetes 弹
- 下一篇: 如何选择最优路径完成云原生上云?听这场阿