2000萬日訂單背后,如何保障系統(tǒng)的高可用?
美團外賣從 2013 年 11 月開始起步,經(jīng)過數(shù)年的高速發(fā)展,一直在不斷地刷新著記錄。2018 年 5 月 19 日,日訂單量峰值突破 2000 萬單,已經(jīng)成為全球規(guī)模最大的外賣平臺。
業(yè)務(wù)的快速發(fā)展對系統(tǒng)穩(wěn)定性提出了更高的要求,如何為線上用戶提供高穩(wěn)定的服務(wù)體驗,保障全鏈路業(yè)務(wù)和系統(tǒng)高可用運行,不僅需要后端服務(wù)支持,更需要在端上提供全面的技術(shù)保障。
而相對服務(wù)端而言,客戶端運行環(huán)境千差萬別,不可控因素多,面對突發(fā)問題應(yīng)急能力差。
因此,構(gòu)建客戶端的高可用建設(shè)體系,保障服務(wù)穩(wěn)定高可用,不僅是對工程師的技術(shù)挑戰(zhàn),也是外賣平臺的核心競爭力之一。
高可用建設(shè)體系的思路
一個設(shè)計良好的大型客戶端系統(tǒng)往往是由一系列各自獨立的小組共同開發(fā)完成的,每一個小組都應(yīng)當(dāng)具有明確定義的的職責(zé)劃分。
各業(yè)務(wù)模塊之間推行“松耦合”開發(fā)模式,讓業(yè)務(wù)模塊擁有隔離式變更的能力,是一種可以同時提升開發(fā)靈活性和系統(tǒng)健壯性的有效手段。
下面是美團外賣整體的業(yè)務(wù)架構(gòu),以商品交易鏈路(門店召回,商品展示,交易)為核心方向進行建設(shè),局部上依據(jù)業(yè)務(wù)特點和團隊分工分成多個可獨立運維單元單獨維護。
可獨立運維單元的簡單性是可靠性的前提條件,這使得我們能夠持續(xù)關(guān)注功能迭代,不斷完成相關(guān)的工程開發(fā)任務(wù)。
我們將問題依照生命周期劃分為三個階段:發(fā)現(xiàn)、定位、解決,圍繞這三個階段的持續(xù)建設(shè),構(gòu)成了美團外賣高可用建設(shè)體系的核心。
美團外賣質(zhì)量保障體系全景圖
這是美團外賣客戶端整體質(zhì)量體系全景圖。整體思路:監(jiān)控報警,日志體系,容災(zāi)。
通過采集業(yè)務(wù)穩(wěn)定性,基礎(chǔ)能力穩(wěn)定性,性能穩(wěn)定性三大類指標(biāo)數(shù)據(jù)并上報,使得衡量客戶端系統(tǒng)質(zhì)量的標(biāo)準(zhǔn)得以完善。
通過設(shè)立基線,應(yīng)用特定業(yè)務(wù)模型對這一系列指標(biāo)進行監(jiān)控報警,客戶端具備了分鐘級感知核心鏈路穩(wěn)定性的能力。
而通過搭建日志體系,整個系統(tǒng)有了提取關(guān)鍵線索能力,多維度快速定位問題。
當(dāng)問題一旦定位,我們就能通過美團外賣的線上運維規(guī)范進行容災(zāi)操作:降級,切換通道或限流,從而保證整體的核心鏈路穩(wěn)定性。
背景監(jiān)控&報警
監(jiān)控系統(tǒng),處于整個服務(wù)可靠度層級模型的最底層,是運維一個可靠的穩(wěn)定系統(tǒng)必不可少的重要組成部分。
為了保障全鏈路業(yè)務(wù)和系統(tǒng)高可用運行,需要在用戶感知問題之前發(fā)現(xiàn)系統(tǒng)中存在的異常,離開了監(jiān)控系統(tǒng),我們就沒有能力分辨客戶端是不是在正常提供服務(wù)。
按照監(jiān)控的領(lǐng)域方向,可以分成系統(tǒng)監(jiān)控與業(yè)務(wù)監(jiān)控:
- 系統(tǒng)監(jiān)控,主要用于基礎(chǔ)能力如端到端成功率,服務(wù)響應(yīng)時長,網(wǎng)絡(luò)流量,硬件性能等相關(guān)的監(jiān)控。
系統(tǒng)監(jiān)控側(cè)重在無業(yè)務(wù)侵入和定制系統(tǒng)級別的監(jiān)控,更多側(cè)重在業(yè)務(wù)應(yīng)用的底層,多屬于單系統(tǒng)級別的監(jiān)控。
- 業(yè)務(wù)監(jiān)控,側(cè)重在某個時間區(qū)間,業(yè)務(wù)的運行情況分析。業(yè)務(wù)監(jiān)控系統(tǒng)構(gòu)建于系統(tǒng)監(jiān)控之上,可以基于系統(tǒng)監(jiān)控的數(shù)據(jù)指標(biāo)計算,并基于特定的業(yè)務(wù)介入,實現(xiàn)多系統(tǒng)之間的數(shù)據(jù)聯(lián)合與分析,并根據(jù)相應(yīng)的業(yè)務(wù)模型,提供實時的業(yè)務(wù)監(jiān)控與告警。
按照業(yè)務(wù)監(jiān)控的時效性,可以繼續(xù)將其細分成實時業(yè)務(wù)監(jiān)控與離線業(yè)務(wù)監(jiān)控。
- 實時業(yè)務(wù)監(jiān)控,通過實時的數(shù)據(jù)采集分析,幫助快速發(fā)現(xiàn)及定位線上問題,提供告警機制及介入響應(yīng)(人工或系統(tǒng))途徑,幫助避免發(fā)生系統(tǒng)故障。
- 離線的業(yè)務(wù)監(jiān)控,對一定時間段收集的數(shù)據(jù)進行數(shù)據(jù)挖掘、聚合、分析,推斷出系統(tǒng)業(yè)務(wù)可能存在的問題,幫助進行業(yè)務(wù)上的重新優(yōu)化或改進的監(jiān)控。
美團外賣的業(yè)務(wù)監(jiān)控,大部分屬于實時業(yè)務(wù)監(jiān)控。借助美團統(tǒng)一的系統(tǒng)監(jiān)控建設(shè)基礎(chǔ),美團外賣聯(lián)合公司其他部門將部分監(jiān)控基礎(chǔ)設(shè)施進行了改造、共建和整合復(fù)用,并打通形成閉環(huán)(監(jiān)控,日志,回?fù)疲?/p>
我們構(gòu)建了特定符合外賣業(yè)務(wù)流程的實時業(yè)務(wù)監(jiān)控,而離線的業(yè)務(wù)監(jiān)控,主要通過用戶行為的統(tǒng)計與業(yè)務(wù)數(shù)據(jù)的挖掘分析,來幫助產(chǎn)品設(shè)計,運營策略行為等產(chǎn)生影響。目前這部分監(jiān)控主要由美團外賣數(shù)據(jù)組提供服務(wù)。
值得特別說明的是單純的信息匯總展示,無需或無法立即做出介入動作的業(yè)務(wù)監(jiān)控,可以稱之為業(yè)務(wù)分析。
如特定區(qū)域的活動消費情況、區(qū)域訂單數(shù)量、特定路徑轉(zhuǎn)換率、曝光點擊率等,除非這些數(shù)據(jù)用來決策系統(tǒng)實時狀態(tài)健康情況,幫助產(chǎn)生系統(tǒng)維護行為,否則這部分監(jiān)控由離線來處理更合適。
我們把客戶端穩(wěn)定性指標(biāo)分為 3 類維度:
- 業(yè)務(wù)穩(wěn)定性指標(biāo)
- 基礎(chǔ)能力穩(wěn)定性指標(biāo)
- 性能穩(wěn)定性指標(biāo)
對不同的指標(biāo),我們采用不同的采集方案進行提取上報,匯總到不同系統(tǒng);在設(shè)定完指標(biāo)后,我們就可以制定基線,并依照特定的業(yè)務(wù)模型制定報警策略。
美團外賣客戶端擁有超過 40 項度量質(zhì)量指標(biāo),其中 25 項指標(biāo)支持分鐘級別報警。
報警通道依據(jù)緊急程度支持郵件,IM 和短信三條通道。因此,我們團隊具備及時發(fā)現(xiàn)影響核心鏈路穩(wěn)定性的關(guān)鍵指標(biāo)變化能力。
一個完善的監(jiān)控報警系統(tǒng)是非常復(fù)雜的,因此在設(shè)計時一定要追求簡化。以下是《Site Reliability Engineering:How Google Runs Production Systems》一書中提到的告警設(shè)置原則:
最能反映真實故障的規(guī)則應(yīng)該可預(yù)測性強,非??煽?,并且越簡單越好
不常用的數(shù)據(jù)采集,匯總以及告警配置應(yīng)該定時清除(某些 SRE 團隊的標(biāo)準(zhǔn)是一季度未使用即刪除)
沒有暴露給任何監(jiān)控后臺、告警規(guī)則的采集數(shù)據(jù)指標(biāo)應(yīng)該定時清除
通過監(jiān)控&報警系統(tǒng),2017 年下半年美團外賣客戶端團隊共發(fā)現(xiàn)影響核心鏈路穩(wěn)定性超過 20 起問題:包括爬蟲、流量、運營商 403 問題、性能問題等。目前,所有問題均已全部改造完畢。
日志體系
監(jiān)控系統(tǒng)的一個重要特征是生產(chǎn)緊急告警。一旦出現(xiàn)故障,需要有人來調(diào)查這項告警,以決定目前是否存在真實故障,是否需要采取特定方法緩解故障,直至查出導(dǎo)致故障的問題根源。
簡單定位和深入調(diào)試的過程必須要保持非常簡單,必須能夠被團隊中任何一個人所理解。日志體系,在簡化這一過程中起到了決定性作用。
美團外賣的日志體系總體分為 3 大類:
- 全量日志系統(tǒng),主要負(fù)責(zé)采集整體性指標(biāo),如網(wǎng)絡(luò)可用性,埋點可用性。我們可以通過它了解到系統(tǒng)整體大盤,了解整體波動,確定問題影響范圍。
- 個體日志系統(tǒng),用于提取個體用戶的關(guān)鍵信息,從而針對性的分析特定客訴問題。
- 異常日志系統(tǒng),主要采集異常指標(biāo),如大圖問題,分享失敗,定位失敗等。我們通過它可以迅速獲取異常上下文信息,分析解決問題。
這三類日志,構(gòu)成了完整的客戶端日志體系。
日志的一個典型使用場景是處理單點客訴問題,解決系統(tǒng)潛在隱患。個體日志系統(tǒng),用于簡化工程師提取關(guān)鍵線索步驟,提升定位分析問題效率。在這一領(lǐng)域,美團外賣使用的是點評平臺開發(fā)的 Logan 服務(wù)。
作為美團移動端底層的基礎(chǔ)日志庫,Logan 接入了集團眾多日志系統(tǒng),例如端到端日志、用戶行為日志、代碼級日志、崩潰日志等。
并且這些日志全部都是本地存儲,且有多重加密機制和嚴(yán)格的權(quán)限審核機制,在處理用戶客訴時才對數(shù)據(jù)進行回?fù)坪头治?,保證用戶隱私安全。
通過設(shè)計和實施美團外賣核心鏈路日志方案,我們打通了用戶交易流程中各系統(tǒng)如訂單,用戶中心,Crash 平臺與 Push 后臺之間的底層數(shù)據(jù)同步。
通過輸出標(biāo)準(zhǔn)問題分析手冊,針對常見個體問題的分析和處理得以標(biāo)準(zhǔn)化;通過制定日志撈取 SOP 并定期演練,線上追溯能力大幅提升,日??驮V絕大部分可在 30 分鐘內(nèi)定位原因。
在這一過程中,通過個體暴露出影響核心鏈路穩(wěn)定性的問題也均已全部改進/修復(fù)。
故障排查是運維大型系統(tǒng)的一項關(guān)鍵技能。采用系統(tǒng)化的工具和手段而不僅僅依靠經(jīng)驗甚至運氣,這項技能是可以自我學(xué)習(xí),也可以內(nèi)部進行傳授。
容災(zāi)備份
針對不同級別的服務(wù),應(yīng)該采取不同的手段進行有效止損。非核心依賴,通過降級向用戶提供可伸縮的服務(wù)。
而核心依賴,采用多通道方式進行依賴備份容災(zāi),保證交易路徑鏈路的高可用;異常流量,通過多維度限流,最大限度保證業(yè)務(wù)可用性的同時,給予用戶良好的體驗。
總結(jié)成三點,即:非核心依賴降級、核心依賴備份、過載保護限流。接下來我們分別來闡述這三方面。
降級
在這里選取美團外賣客戶端整體系統(tǒng)結(jié)構(gòu)關(guān)系圖來介紹非核心依賴降級建設(shè)概覽。
圖上中間紅色部分是核心關(guān)鍵節(jié)點,即外賣業(yè)務(wù)的核心鏈路:定位,商家召回,商品展示,下單;藍色部分,是核心鏈路依賴的關(guān)鍵服務(wù);黃色部分,是可降級服務(wù)。
我們通過梳理依賴關(guān)系,改造前后端通訊協(xié)議,實現(xiàn)了客戶端非核心依賴可降級。
而后端服務(wù),通過各級緩存,屏蔽隔離策略,實現(xiàn)了業(yè)務(wù)模塊內(nèi)部可降級,業(yè)務(wù)之間可降級。這構(gòu)成了美團外賣客戶端整體的降級體系。
右邊則是美團外賣客戶端業(yè)務(wù)/技術(shù)降級開關(guān)流程圖。通過推拉結(jié)合,緩存更新策略,我們能夠分鐘級別同步降級配置,快速止損。
目前,美團外賣客戶端有超過 20 項業(yè)務(wù)/能力支持降級。通過有效降級,我們避開了 1 次 S2 級事故,多次 S3、S4 級事故。
此外,降級開關(guān)整體方案產(chǎn)出 SDK horn,推廣至集團酒旅、金融等其他核心業(yè)務(wù)應(yīng)用。
備份
核心依賴備份建設(shè)上,在此重點介紹美團外賣多網(wǎng)絡(luò)通道。網(wǎng)絡(luò)通道,作為客戶端的最核心依賴,卻是整個全鏈路體系最不可控的部分,經(jīng)常出現(xiàn)問題。
網(wǎng)絡(luò)劫持,運營商故障,甚至光纖被物理挖斷等大大小小的故障嚴(yán)重影響了核心鏈路的穩(wěn)定性。因此,治理網(wǎng)絡(luò)問題,必須要建設(shè)可靠的多通道備份。
這是美團外賣多網(wǎng)絡(luò)通道備份示意圖。美團外賣客戶端擁有 Shark、HTTP、HTTPS、HTTP DNS 四條網(wǎng)絡(luò)通道:整體網(wǎng)絡(luò)以 Shark 長連通道為主通道,其余三條通道作為備份通道。
配合完備的開關(guān)切換流程,可以在網(wǎng)絡(luò)指標(biāo)發(fā)生驟降時,實現(xiàn)分鐘級別的分城市網(wǎng)絡(luò)通道切換。
而通過制定故障應(yīng)急 SOP 并不斷演練,提升了我們解決問題的能力和速度,有效應(yīng)對各類網(wǎng)絡(luò)異常。我們的網(wǎng)絡(luò)通道開關(guān)思路也輸出至集團其他部門,有效支持了業(yè)務(wù)發(fā)展。
限流
服務(wù)過載是另一類典型的事故。究其原因大部分情況下都是由于少數(shù)調(diào)用方調(diào)用的少數(shù)接口性能很差,導(dǎo)致對應(yīng)服務(wù)的性能惡化。
若調(diào)用端缺乏有效降級容錯,在某些正常情況下能夠降低錯誤率的手段,如請求失敗后重試,反而會讓服務(wù)進一步性能惡化,甚至影響本來正常的服務(wù)調(diào)用。
美團外賣業(yè)務(wù)在高峰期訂單量已達到了相當(dāng)高的規(guī)模量級,業(yè)務(wù)系統(tǒng)也極其復(fù)雜。
根據(jù)以往經(jīng)驗,在業(yè)務(wù)高峰期,一旦出現(xiàn)異常流量瘋狂增長從而導(dǎo)致服務(wù)器宕機,則損失不可估量。
因此,美團外賣前后端聯(lián)合開發(fā)了一套“流量控制系統(tǒng)”,對流量實施實時控制。
這樣既能日常保證業(yè)務(wù)系統(tǒng)穩(wěn)定運轉(zhuǎn),也能在業(yè)務(wù)系統(tǒng)出現(xiàn)問題的時候提供一套優(yōu)雅的降級方案,最大限度保證業(yè)務(wù)的可用性,在將損失降到最低的前提下,給予用戶良好的體驗。
整套系統(tǒng),后端服務(wù)負(fù)責(zé)識別打標(biāo)分類,通過統(tǒng)一的協(xié)議告訴前端所標(biāo)識類別。
而前端,通過多級流控檢查,對不同流量進行區(qū)分處理:彈驗證碼,或排隊等待,或直接處理,或直接丟棄。
面對不同場景,系統(tǒng)支持多級流控方案,可有效攔截系統(tǒng)過載流量,防止系統(tǒng)雪崩。
此外,整套系統(tǒng)擁有分接口流控監(jiān)控能力,可對流控效果進行監(jiān)控,及時發(fā)現(xiàn)系統(tǒng)異常。整套方案在數(shù)次異常流量增長的故障中,經(jīng)受住了考驗。
發(fā)布
隨著外賣業(yè)務(wù)的發(fā)展,美團外賣的用戶量和訂單量已經(jīng)達到了相當(dāng)?shù)牧考?,在線直接全量發(fā)布版本/功能影響范圍大,風(fēng)險高。
版本灰度和功能灰度是一種能夠平滑過渡的發(fā)布方式:即在線上進行 A/B 實驗,讓一部分用戶繼續(xù)使用產(chǎn)品(特性)A,另一部分用戶開始使用產(chǎn)品(特性)B。
如果各項指標(biāo)平穩(wěn)正常,結(jié)果符合預(yù)期,則擴大范圍,將所有用戶都遷移到 B 上來,否則回滾。
灰度發(fā)布可以保證系統(tǒng)的穩(wěn)定,在初試階段就可以發(fā)現(xiàn)問題,修復(fù)問題,調(diào)整策略,保證影響范圍不被擴散。
美團外賣客戶端在版本灰度及功能灰度已較為完善:
- 版本灰度,iOS 采用蘋果官方提供的分階段發(fā)布方式,Android 則采用美團自研的 EVA 包管理后臺進行發(fā)布。這兩類發(fā)布均支持逐步放量的分發(fā)方式。
- 功能灰度,功能發(fā)布開關(guān)配置系統(tǒng)依據(jù)用戶特征維度(如城市,用戶 ID)發(fā)布,并且整個配置系統(tǒng)有測試和線上兩套不同環(huán)境,配合固定的上線窗口,保證上線的規(guī)范性。
對應(yīng)的,相應(yīng)的監(jiān)控基礎(chǔ)設(shè)施也支持分用戶特征維度(如城市,用戶 ID)監(jiān)控,避免了那些無法在整體大盤體現(xiàn)的灰度異常。
此外,無論版本灰度或功能灰度,我們均有相應(yīng)最小灰度周期和回滾機制,保證整個灰度發(fā)布過程可控,最小化問題影響。
線上運維
在故障來臨時如何應(yīng)對,是整個質(zhì)量保障體系中最關(guān)鍵的環(huán)節(jié)。沒有人天生就能完美的處理緊急情況,面對問題,恰當(dāng)?shù)奶幚硇枰綍r不斷的演練。
圍繞問題的生命周期,即發(fā)現(xiàn)、定位、解決(預(yù)防),美團外賣客戶端團隊組建了一套完備的處理流程和規(guī)范來應(yīng)對影響鏈路穩(wěn)定性的各類線上問題。
整體思路:建立規(guī)范,提前建設(shè),有效應(yīng)對,事后總結(jié),如下圖:
在不同階段用不同方式解決不同問題,事前確定完整的事故流程管理策略,并確保平穩(wěn)實施,經(jīng)常演練,問題的平均恢復(fù)時間大大降低,美團外賣核心鏈路的高穩(wěn)定性才能夠得以保障。
未來展望
當(dāng)前美團外賣業(yè)務(wù)仍然處于快速增長期。伴隨著業(yè)務(wù)的發(fā)展,背后支持業(yè)務(wù)的技術(shù)系統(tǒng)也日趨復(fù)雜。
在美團外賣客戶端高可用體系建設(shè)過程中,我們希望能夠通過一套智能化運維系統(tǒng),幫助工程師快速、準(zhǔn)確的識別核心鏈路各子系統(tǒng)異常,發(fā)現(xiàn)問題根源。
并自動執(zhí)行對應(yīng)的異常解決預(yù)案,進一步縮短服務(wù)恢復(fù)時間,從而避免或減少線上事故影響。
誠然,業(yè)界關(guān)于自動化運維的探索有很多,但多數(shù)都集中在后臺服務(wù)領(lǐng)域,前端方向成果較少。
我們外賣技術(shù)團隊目前也在同步的探索中,正處于基礎(chǔ)性建設(shè)階段,歡迎更多業(yè)界同行跟我們一起討論、切磋。
作者:陳航、富強、徐宏
簡介:陳航,美團高級技術(shù)專家。2015 年加入美團,目前負(fù)責(zé)美團外賣 iOS 團隊,對移動端架構(gòu)演進,監(jiān)控報警備份容災(zāi),移動端線上運維等領(lǐng)域有深刻理解。
富強,美團資深工程師。2015 年加入美團,是外賣 iOS 的早期開發(fā)者之一,目前作為美團外賣 iOS 基礎(chǔ)設(shè)施小組負(fù)責(zé)人,負(fù)責(zé)外賣基礎(chǔ)設(shè)施及廣告運營相關(guān)業(yè)務(wù)。
徐宏,美團高級工程師。2016 年加入美團,目前作為外賣 iOS 團隊主力開發(fā),負(fù)責(zé)移動端 APM 性能監(jiān)控,高可用基礎(chǔ)設(shè)施支撐相關(guān)推進工作。