自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

日單量從百萬到千萬,滴滴全鏈路壓測實踐

新聞
穩(wěn)定性是技術(shù)團隊的命根子,滴滴也在搞全鏈路壓測了。雖然才四五年,滴滴內(nèi)部已經(jīng)有了眾多系統(tǒng),而且號稱四大語言,八大框架,改造成本可想而知。

??

[[208127]]

??

穩(wěn)定性是技術(shù)團隊的命根子,滴滴也在搞全鏈路壓測了。雖然才四五年,滴滴內(nèi)部已經(jīng)有了眾多系統(tǒng),而且號稱四大語言,八大框架,改造成本可想而知。

如何做到釜底抽薪,支持線上環(huán)境的全鏈路壓測?而且與一般電商不同,滴滴的交易是實時的,乘客發(fā)單,附近需要有司機能立即接單,順風(fēng)車尤為復(fù)雜,研發(fā)壓測工具又面臨著怎樣的挑戰(zhàn)?

滴滴出行創(chuàng)立于 2012 年,是全球領(lǐng)先的一站式多元化出行平臺。經(jīng)歷過各種燒錢補貼大戰(zhàn)、多次合并,滴滴成為繼阿里之后,國內(nèi)第二個日訂單量超過千萬的公司。

??

[[208128]]

??

業(yè)務(wù)飛速增長,IT 系統(tǒng)面臨的挑戰(zhàn)通常更甚于業(yè)務(wù),因為不僅需求規(guī)模增加,技術(shù)人員數(shù)量增加,面臨問題的復(fù)雜度也增加。

??

??

2016 年的滴滴,正在經(jīng)歷這樣的階段,一方面日單量從百萬沖到千萬,另一方面 IT 系統(tǒng)屢次出現(xiàn)線上故障,穩(wěn)定性建設(shè)成為支撐業(yè)務(wù)發(fā)展的重要保障。在此背景下,滴滴啟動了全鏈路壓測項目。

壓測方案

滴滴的業(yè)務(wù)與普通電商差別較大,一次典型的用戶打車流程是這樣的:乘客發(fā)單,0-3 分鐘內(nèi)派給附近的司機,司機搶單后,去接乘客,到達目的地。這不但要求司乘的位置相近,而且交易必須是實時的。

基于滴滴業(yè)務(wù)的特殊性,同時借鑒了業(yè)內(nèi)的經(jīng)驗,我們制定了滴滴的全鏈路壓測方案,一句話描述就是:在線上環(huán)境,針對全業(yè)務(wù)核心鏈路,以數(shù)據(jù)隔離的方式進行壓測,如下圖所示:

??

??

線上環(huán)境

基于阿里等公司之前的經(jīng)驗,壓測在線上環(huán)境進行,線上***的優(yōu)點就是環(huán)境真實,不需要擔(dān)心配置不一致、結(jié)果是否可以同比例放大等問題,壓測的結(jié)果自然也更為精確。

但在線上做壓測,需要保證安全性,風(fēng)險不言而喻:不能搞垮線上系統(tǒng)。這就需要將壓測的時間窗口限定在低峰期;監(jiān)控必須給力,在系統(tǒng)出現(xiàn)單點故障前,要能夠提前預(yù)警,萬一真的出現(xiàn)故障,必須緊急停止壓力,最短時間內(nèi)進行恢復(fù)。

全業(yè)務(wù)核心鏈路

它支持出租車、專車、快車、順風(fēng)車等幾個主要的業(yè)務(wù)線,覆蓋主要的業(yè)務(wù)場景,以出租車為例,從乘客打開 APP 輸入上車點、目的地、發(fā)單,到司機出車、搶單、接乘客上車、到達目的地,甚至取消訂單等完整流程。

流程圖如下所示:

??

??

數(shù)據(jù)隔離

壓測方案的核心是數(shù)據(jù)隔離,需要做到壓測司乘要與真實司乘區(qū)分,壓測訂單不能與真實訂單混淆,絕不能把真實乘客的單派給虛擬司機等問題。

下面將專門介紹壓測的數(shù)據(jù)隔離方案。

01數(shù)據(jù)隔離方案

與其談隔離方案,不如讓我們想象幾種數(shù)據(jù)隔離不好的場景:

  • 某真實司機的歷史訂單突然多了一些假訂單,積分、券、余額等出錯。
  • 某真實乘客的訂單被派給了虛擬司機,乘客一直在等待司機來接。
  • 某城市的 BI 報表出錯,莫名其妙的多了一些訂單,貌似財務(wù)也對不上。
  • 某城市的運力估計及動調(diào)出現(xiàn)異常波動。
  • 清理虛擬訂單及相關(guān)數(shù)據(jù)時,不小心誤刪了真實訂單和數(shù)據(jù)......

虛擬訂單方案

隔離不好的場景,光是想想就不寒而栗,可以讓我們輕易排除這種看似最簡單的方案:使用真實司機乘客,發(fā)送虛擬訂單。

虛擬訂單通過 ID 或者標志字段進行區(qū)分,派單時做特殊處理。這種方式對業(yè)務(wù)有較大的侵入性,不僅是修改派單那么簡單,還需要從各個維度適時地屏蔽司乘與虛擬訂單的關(guān)系,如訂單歷史、通知推送、積分統(tǒng)計等,不但多而且是強依賴,顯然不是一種合理的方案。

提升虛擬的層次

每個城市啟用一批虛擬的乘客,發(fā)送虛擬訂單,派發(fā)給虛擬司機,司乘及訂單上通過 ID 或者標志字段進行區(qū)分。

這可以解決司乘及訂單強依賴的問題。但從城市的角度看,需要隔離真實司乘與虛擬司乘,又會涉及到城市的動態(tài)調(diào)價、供需預(yù)測、BI 統(tǒng)計等各個方面的隔離。

再提升虛擬的層次

與傳統(tǒng)電商不同,Uber、滴滴這樣的出行平臺,都是按城市運營的,通過配置的方式開城,從而實現(xiàn)業(yè)務(wù)的橫向快速擴展。

那有沒有可能在中國開辟一個甚至多個虛擬的城市呢,壓測只在虛擬城市進行呢? 開辟虛擬城市,可以避免前面提到的諸多問題,尤其是隔離問題,但需要考慮虛擬乘客發(fā)布路線、虛擬司機地圖導(dǎo)航的問題,城市的位置、道路怎么模擬?

干脆再進一步,虛擬一個完整的中國了,看似比較瘋狂,但這就是滴滴全鏈路壓測時的隔離方案。

在某虛擬國家,有很多虛擬的城市,每個虛擬城市都有一群虛擬的司機和乘客,他們使用虛擬的手機號和客戶端,進行線上交易,由此產(chǎn)生了虛擬的訂單。

這里仍然要解決位置、道路的問題,我們把中國的坐標全部偏移到太平洋,“太平洋足夠大,完全容得下中美兩個國家”,那一個中國自然不再話下。至于虛擬城市的位置、道路,把真實城市偏移一定的經(jīng)緯度就可以。

02壓測流量標記方案

考慮這樣的場景:在新開辟的虛擬城市,某虛擬的乘客要打車,他打開虛擬的手機端,輸入目的地,點擊“立即預(yù)約”,請求發(fā)送到滴滴的后臺系統(tǒng),后臺應(yīng)該怎樣處理?

談?wù)摲桨钢?,先了解一下現(xiàn)狀:

??

??

傳說有一種系統(tǒng)叫別人家的系統(tǒng),有一個語言叫別人家的語言,有一種協(xié)議叫別人家的協(xié)議。

正所謂人比人氣死人,回頭看看自己家的,雖然與很多前輩不敢相提并論,但已號稱四大語言八大框架,這個鍋得讓歷史遺留問題來背,而這段歷史,只有短短的幾年而已。

也有好消息,與 Google 的 Dapper、阿里的鷹眼類似,滴滴內(nèi)部有一套自己的 Trace 系統(tǒng),專門用來跟蹤系統(tǒng)之間的調(diào)用鏈路,其基本原理如下圖所示:

??

??

但并不全是好消息,全鏈路壓測啟動的時候,Trace 系統(tǒng)在滴滴內(nèi)部并未完全推廣,不少系統(tǒng)不支持。

壓測流量標記方案面臨兩重選擇:

  • 每個系統(tǒng)使用業(yè)務(wù) ID 或標記來判斷壓測流量,只要能拿到司乘、訂單等業(yè)務(wù)數(shù)據(jù),系統(tǒng)就可以正確區(qū)分。
  • 擴展 Trace 通路,在通路上添加壓測標記,統(tǒng)一使用 Trace 來判斷壓測流量。

最終我們選擇了方案 2,不但與業(yè)務(wù)完全解耦,還可以避免方案 1 中某些系統(tǒng)或接口無法拿到業(yè)務(wù)標記的情況。而且這種方式,客觀上也可以推進 Trace 通路在公司的應(yīng)用。

做不到語言和框架收斂,盡量讓中間件收斂,為每種語言提供一個基礎(chǔ)組件類庫,中間件盡量收斂到該類庫。

??

??

于是結(jié)合全鏈路壓測,開始了內(nèi)部系統(tǒng)痛苦的改造之路,最終基于 Trace 通路的壓測標記在主要系統(tǒng)之間可以跑通。

03工具端方案

鏈路已通,該考慮工具端的實現(xiàn)方案了,內(nèi)部我們管工具端叫做虛擬的“司機端”和“乘客端”,可以用來模擬批量甚至大量的用戶,而不僅僅是一個用戶。

分布式的虛擬司乘端: 滴滴的客戶端與后臺通信,不僅僅有 HTTP 協(xié)議,還有 TCP 長連接,甚至還有 Thrift 協(xié)議。

拿司機來說,接單等消息是通過 TCP 長連接下發(fā)的,意味著 TCP 長連接協(xié)議是必須的,而且需要為每個司機維護一個長連接。

考慮到需要模擬的司乘數(shù)量,虛擬的司機端、乘客端是分布式部署的,每個司乘端從數(shù)據(jù)中心獲取司乘用戶,包含基本信息、乘客路線、司機起始位置等信息,并且模擬批量司乘的發(fā)單等行為。

使用數(shù)據(jù)中心的目的是,當(dāng)端需要擴展時,拉取的司乘不能重復(fù),不然重復(fù)登錄可能導(dǎo)致被踢下線。

??

??

可動態(tài)調(diào)整的業(yè)務(wù)模型: 虛擬端要模擬相對復(fù)雜、實時的交易模型,并且需要模擬不同的業(yè)務(wù)場景,以順風(fēng)車舉例,平日高峰期的訂單多為市內(nèi)訂單,而節(jié)假日的跨城訂單比率增加很多。

如何在不改代碼的情況下可以壓測不同的業(yè)務(wù)場景?我們實現(xiàn)了可動態(tài)調(diào)整的業(yè)務(wù)模型。

??

??

該模型中,司乘基本的交易過程、狀態(tài)變化可以通過模型編輯完成,通過權(quán)重,可以調(diào)整用戶本地單、跨城單的比例。即使更多的業(yè)務(wù)場景,只需生成業(yè)務(wù)模型即可支持。

更多實現(xiàn)細節(jié): 當(dāng)然除了上面提到的,方案上還有很多細節(jié)需要考慮。為了與線上實際場景更貼近,我們從線上高峰期截取了一段時間內(nèi)的乘客路線和司機位置,分階段壓測時,逐漸投放更多的司乘到虛擬城市,但這樣有一個問題。

假設(shè) A 城市有 1 萬司機,高峰期有 1 萬乘客在發(fā)單,他們都是隨機而均勻分布的,如果把全部司機瞬間投放完成,所有乘客立即發(fā)單,絕大多數(shù)訂單應(yīng)該是可以派出并完成交易的。

但是考慮分階段投放的場景:投放 1% 的司乘,上百名司機,上百個訂單,雖然司機位置、乘客路線來自線上真實訂單的采樣,由于位置的隨機性,成單量可能很少。即使投放了 10%,上千名司乘,實際成單量也遠遠達不到 1000 個。

??

??

而我們分階段投放要求的 10%,不光是投放數(shù)量達到線上 10%,也期望成單量等數(shù)據(jù)同步達到 10%,這樣才能驗證工具端方案是否合理、線上壓力是否正常。

在這里,我們采用了一個簡單的算法:東單是北京的一個熱點區(qū)域,***個司機、乘客投放在東單,基本上可以保證成單;前 1000 名司機、乘客投放在東單附近,成單量雖不能上千,但比完全隨機要好很多。

控制好司乘投放的位置,基本可以保證成單量與投放數(shù)量成比例增長。

??

??

壓測實錄

2016 年上半年是滴滴 Uber 合并前***的瘋狂,運營活動頻繁,業(yè)務(wù)峰值不斷攀升,平臺出現(xiàn)的線上事故也較為多些。

??

??

從 2016 年中項目啟動,經(jīng)過多次嘗試、探索,終于在線上成功進行了全鏈路壓測。為了不影響線上業(yè)務(wù),壓測的窗口期選擇在凌晨,并且嚴格掌控壓測節(jié)奏,把壓測過程劃分成幾個不同階段,逐漸提升壓力,邊壓測邊監(jiān)控后臺系統(tǒng)的壓力:

??

??

 

幾個主要的業(yè)務(wù)線先后進行了十余次壓測,并發(fā)現(xiàn)了一些線上問題,如某 API 接口耗時明顯增長;長連接服務(wù)器的參數(shù)配置有誤;分單服務(wù) codis 訪問超時;日志過多導(dǎo)致分單算法超時等。

除了驗證線上系統(tǒng)的穩(wěn)定性,全鏈路壓測項目還帶來一些附加的收益:

  • 不同語言下的基礎(chǔ)組件類庫趨向收斂,Trace 通道覆蓋了更多模塊。
  • 建立了一套完整隔離的線上環(huán)境,未來可以在線上做更多正確性驗證。

現(xiàn)在的滴滴,越來越重視平臺穩(wěn)定性,對事故的預(yù)警、降級處理和事故處理預(yù)案越來越成熟,事故時長也明顯縮短,但仍然存在單點故障、魯棒性不高等潛在風(fēng)險。

展望將來,期望全鏈路壓測能在更多領(lǐng)域發(fā)揮作用:

  • 線上環(huán)境的故障注入和故障演練。
  • 線上灰度發(fā)布環(huán)境的正確性驗證。
  • 線上系統(tǒng)的容量預(yù)估等。

??

[[208133]]

??

張曉慶

滴滴出行技術(shù)專家

全棧工程師,現(xiàn)任滴滴技術(shù)專家,曾就職于 ThoughtWorks,有多年的軟件開發(fā)、敏捷咨詢經(jīng)驗。

責(zé)任編輯:武曉燕 來源: 青云QingCloud微信公眾號
相關(guān)推薦

2022-06-27 11:06:33

全鏈路影子庫影子表

2024-06-26 08:55:29

2022-06-16 10:48:07

系統(tǒng)壓測數(shù)據(jù)

2016-11-09 18:07:00

京東

2018-01-10 14:08:34

阿里雙11壓測

2023-07-20 15:46:24

2025-03-04 08:53:10

2021-09-02 10:30:51

mPaaS 全鏈路壓力測試

2018-01-31 09:34:25

互聯(lián)網(wǎng)電商全鏈路

2023-10-30 07:25:37

數(shù)據(jù)湖數(shù)據(jù)處理

2025-03-26 08:01:18

2016-01-14 13:07:20

美團壓測工具工具

2024-07-25 11:58:35

2023-01-30 22:34:44

Node.js前端

2022-08-07 21:59:57

高可用架構(gòu)

2021-11-18 10:01:00

Istio 全鏈路灰度微服務(wù)框架

2024-09-19 14:02:16

2022-08-30 09:42:35

MC-LAG單鏈路網(wǎng)絡(luò)

2024-01-05 00:29:36

全鏈路灰度發(fā)布云原生

2017-07-07 10:53:34

阿里云高可用體系
點贊
收藏

51CTO技術(shù)棧公眾號