上線效率提升8倍,攜程門票活動(dòng)直連平臺(tái)實(shí)踐
?作者|Harry,攜程資深后端開發(fā)工程師,負(fù)責(zé)直連平臺(tái)建設(shè),關(guān)注系統(tǒng)高可用、數(shù)據(jù)驅(qū)動(dòng)等領(lǐng)域。
一、前言
攜程門票活動(dòng)供應(yīng)商直連平臺(tái)(以下簡(jiǎn)稱“直連平臺(tái)”)通過API對(duì)接多個(gè)供應(yīng)商的訂單和商品系統(tǒng),實(shí)現(xiàn)自動(dòng)化信息同步和狀態(tài)流轉(zhuǎn)。
隨著業(yè)務(wù)的高速發(fā)展,供應(yīng)商的對(duì)接需求與日俱增,這不僅對(duì)直連平臺(tái)接入供應(yīng)商的上線效率提出更高的要求,同時(shí)供應(yīng)商系統(tǒng)的物理網(wǎng)絡(luò)限制、穩(wěn)定性參差不齊等情況也給直連平臺(tái)帶來(lái)不小的挑戰(zhàn)。
本文將從提高供應(yīng)商接入效率和增強(qiáng)系統(tǒng)穩(wěn)定性兩個(gè)方面分享直連平臺(tái)的實(shí)踐經(jīng)驗(yàn)。
二、背景
2.1 系統(tǒng)介紹
直連平臺(tái)作為供應(yīng)商與攜程內(nèi)部系統(tǒng)的適配層,主要支持兩條通路:一是同步供應(yīng)商的商品信息到商品系統(tǒng),如價(jià)格、庫(kù)存、內(nèi)容等;二是同步訂單信息,如訂單狀態(tài)、憑證信息等。直連平臺(tái)針對(duì)不同供應(yīng)商提供對(duì)應(yīng)的適配邏輯,以匹配訂單系統(tǒng)和商品系統(tǒng)的接口。開放平臺(tái)為供應(yīng)商提供方便快速接入的OpenApi和沙箱工具。

圖1 直連平臺(tái)系統(tǒng)介紹
2.2 挑戰(zhàn)
隨著供應(yīng)商接入需求越來(lái)越多,不同供應(yīng)商系統(tǒng)之間的差異也愈加明顯,在供應(yīng)商上線效率和系統(tǒng)穩(wěn)定性上帶來(lái)新的挑戰(zhàn)。
2.2.1 效率
大量供應(yīng)商通過OpenApi接入平臺(tái)。每家供應(yīng)商在上線前,平臺(tái)需要投入約2人日的聯(lián)調(diào)和驗(yàn)收。當(dāng)接入中的供應(yīng)商數(shù)量越來(lái)越多時(shí),直連平臺(tái)需要排期對(duì)供應(yīng)商進(jìn)行逐個(gè)處理,延長(zhǎng)了供應(yīng)商的上線周期,影響上線效率。
2.2.2 穩(wěn)定性
不同供應(yīng)商系統(tǒng)的物理網(wǎng)絡(luò)、系統(tǒng)軟件之間往往存在差異,承載能力不一。當(dāng)直連平臺(tái)的訂單流量超過供應(yīng)商系統(tǒng)的承載能力時(shí),會(huì)造成其系統(tǒng)不穩(wěn)定,甚至引起長(zhǎng)時(shí)間系統(tǒng)故障,影響平臺(tái)出票。對(duì)于已有限流策略的供應(yīng)商,如果直連平臺(tái)的QPS過大時(shí),請(qǐng)求也會(huì)被其直接攔截,故需要平臺(tái)適配不同供應(yīng)商的承載能力。
當(dāng)供應(yīng)商系統(tǒng)出現(xiàn)停機(jī)升級(jí)、宕機(jī)或網(wǎng)絡(luò)異常等情況,平臺(tái)會(huì)產(chǎn)生大量異?;虺瑫r(shí)的訂單,造成大量客人支付后退訂,嚴(yán)重影響下單的對(duì)接成功率。供應(yīng)商系統(tǒng)異常后,由人工介入處理,雖能在一定程度緩解該問題,但仍會(huì)出現(xiàn)費(fèi)力度高和介入不及時(shí)等問題。
由于各供應(yīng)商返回的錯(cuò)誤信息不一致,平臺(tái)難以根據(jù)失敗原因進(jìn)行預(yù)警或系統(tǒng)干預(yù)。
三、實(shí)踐
直連平臺(tái)學(xué)習(xí)借鑒行業(yè)通用方案,并結(jié)合平臺(tái)實(shí)際情況,在提升效率和提高穩(wěn)定性方面做了如下實(shí)踐。
3.1 提升效率
供應(yīng)商和直連平臺(tái)均對(duì)OpenApi的測(cè)試環(huán)節(jié)有提升效率和降低成本的訴求,直連平臺(tái)希望提供一個(gè)方便供應(yīng)商自測(cè),且能保證測(cè)試質(zhì)量的工具。
3.1.1 方案
沙箱能對(duì)供應(yīng)商提供自助測(cè)試的支持,可以節(jié)省人力和提高供應(yīng)商上線效率,同時(shí)也能保護(hù)直連平臺(tái)正式環(huán)境不受干擾,所以是開放平臺(tái)的首選。
在網(wǎng)絡(luò)安全方面,沙箱指在隔離環(huán)境中,用以測(cè)試不受信任的文件或應(yīng)用程序等行為的工具。不明程序讓它在沙箱內(nèi)運(yùn)行,程序無(wú)權(quán)修改沙箱外的程序及系統(tǒng)設(shè)置,保障了系統(tǒng)不會(huì)遭到惡意軟件及病毒的篡改和入侵。
一般開放平臺(tái)中的沙箱,僅能測(cè)試單個(gè)接口和顯示接口日志。和同行業(yè)的其他沙箱相比,本文介紹的沙箱(以下簡(jiǎn)稱“平臺(tái)沙箱”)還支持測(cè)試業(yè)務(wù)場(chǎng)景、自動(dòng)驗(yàn)收上線等功能,在提高上線效率的同時(shí),還能提高對(duì)接質(zhì)量。

圖2 平臺(tái)沙箱 vs 其他沙箱
3.1.2 平臺(tái)沙箱簡(jiǎn)介
為了給供應(yīng)商提供靈活易用的自助測(cè)試工具,平臺(tái)沙箱支持供應(yīng)商根據(jù)自身系統(tǒng)參數(shù)和業(yè)務(wù)類型進(jìn)行相關(guān)配置。供應(yīng)商在提交測(cè)試任務(wù)后,平臺(tái)沙箱結(jié)合供應(yīng)商配置和測(cè)試用例的匹配策略,從測(cè)試用例池中匹配所需的測(cè)試用例。測(cè)試用例的處理支持自動(dòng)化,即便對(duì)于需要供應(yīng)商主動(dòng)推送通知的用例,平臺(tái)沙箱也支持?jǐn)帱c(diǎn)執(zhí)行。平臺(tái)沙箱接收到供應(yīng)商推送的正確報(bào)文后繼續(xù)完成后續(xù)測(cè)試任務(wù),整個(gè)過程無(wú)需平臺(tái)人工干預(yù)。全部用例執(zhí)行成功后,即達(dá)到平臺(tái)沙箱驗(yàn)收標(biāo)準(zhǔn),系統(tǒng)將自動(dòng)上線。

圖3 平臺(tái)沙箱處理流程
為了實(shí)現(xiàn)平臺(tái)沙箱的全自動(dòng)化,直連平臺(tái)需要重點(diǎn)考慮以下4個(gè)核心環(huán)節(jié):

圖4 平臺(tái)沙箱核心環(huán)節(jié)
3.1.3 用例定義
人工聯(lián)調(diào)測(cè)試時(shí),測(cè)試人員需要依據(jù)供應(yīng)商接口類型及業(yè)務(wù)場(chǎng)景編寫不同測(cè)試用例,用例類型常包含功能測(cè)試、異常測(cè)試、邊界測(cè)試等。這種基于業(yè)務(wù)場(chǎng)景的測(cè)試用例可以保證測(cè)試質(zhì)量。平臺(tái)經(jīng)調(diào)研其他公司的沙箱后發(fā)現(xiàn),絕大多數(shù)的沙箱僅能給用戶提供單接口測(cè)試的頁(yè)面,有的頁(yè)面雖然能組裝報(bào)文或查看接口日志,但由于沒有約束業(yè)務(wù)場(chǎng)景和校驗(yàn)點(diǎn),故測(cè)試的質(zhì)量高低不一,為上線后的對(duì)接質(zhì)量帶來(lái)隱患。
而平臺(tái)沙箱通過把一個(gè)或多個(gè)接口組織在一個(gè)有明確測(cè)試目的的場(chǎng)景中,讓供應(yīng)商的測(cè)試流程更清晰,也更容易把握校驗(yàn)點(diǎn)。

圖5 單接口測(cè)試 vs 場(chǎng)景化測(cè)試
3.1.4 用例匹配
不同供應(yīng)商的產(chǎn)品形態(tài)、接口處理方式會(huì)有不同,故所需的測(cè)試用例集合也不同。為了實(shí)現(xiàn)供應(yīng)商與測(cè)試用例的自動(dòng)匹配,平臺(tái)在維護(hù)測(cè)試用例時(shí)會(huì)為每個(gè)測(cè)試用例設(shè)置不同的匹配規(guī)則。匹配規(guī)則包含供應(yīng)商是否接入指定接口、指定接口是同步或異步處理以及具體業(yè)務(wù)參數(shù),如:是否檢驗(yàn)底價(jià)、是否校驗(yàn)庫(kù)存、是否需要證件等。

圖6 用例匹配過程
3.1.5 用例執(zhí)行
匹配得到測(cè)試用例集合之后,平臺(tái)沙箱會(huì)自動(dòng)執(zhí)行每一個(gè)測(cè)試用例。每個(gè)測(cè)試用例包含的多個(gè)接口,可能是平臺(tái)調(diào)用供應(yīng)商的接口(如下單接口),也可能是供應(yīng)商調(diào)用平臺(tái)的接口(如下單確認(rèn)通知接口)。以“用例定義”章節(jié)中的case#1和case#3為例,分別介紹普通執(zhí)行流程和斷點(diǎn)執(zhí)行流程,如下圖:

圖7 用例執(zhí)行流程(普通執(zhí)行流程、斷點(diǎn)執(zhí)行流程)
3.1.6 自動(dòng)驗(yàn)收
每個(gè)測(cè)試用例都是獨(dú)立的、可重復(fù)執(zhí)行的,所以允許供應(yīng)商進(jìn)行重復(fù)測(cè)試,直至執(zhí)行成功。平臺(tái)沙箱自動(dòng)統(tǒng)計(jì)測(cè)試用例的結(jié)果。測(cè)試用例涵蓋了幾乎全部的業(yè)務(wù)場(chǎng)景,全部測(cè)試用例都執(zhí)行成功,則認(rèn)為供應(yīng)商根據(jù)直連平臺(tái)OpenApi開發(fā)的對(duì)接系統(tǒng)達(dá)到驗(yàn)收標(biāo)準(zhǔn)。達(dá)標(biāo)后,供應(yīng)商需要在平臺(tái)沙箱上主動(dòng)通知直連平臺(tái)。平臺(tái)將自動(dòng)為供應(yīng)商做上線配置,完成從平臺(tái)沙箱測(cè)試到驗(yàn)收上線的全部流程。
3.1.7 成果
平臺(tái)沙箱上線后,供應(yīng)商測(cè)試和驗(yàn)收不再受制于平臺(tái)人力,對(duì)接OpenApi的供應(yīng)商每月平均上線數(shù)量相較于上線前提高了8倍以上,供應(yīng)商平均接入總耗時(shí)從平均23人日下降到6人日。

圖8 沙箱上線前后比較
3.2 提高穩(wěn)定性
系統(tǒng)穩(wěn)定性是指系統(tǒng)要素在外界影響下表現(xiàn)出的某種穩(wěn)定狀態(tài)。在節(jié)假日或營(yíng)銷活動(dòng)期間,訂單量會(huì)是平常的幾倍或幾十倍,這會(huì)給供應(yīng)商系統(tǒng)的穩(wěn)定性帶來(lái)很大風(fēng)險(xiǎn)。直連平臺(tái)需要控制流量,提高供應(yīng)商系統(tǒng)的穩(wěn)定性。
3.2.1 方案
對(duì)于承載能力低于直連平臺(tái)的供應(yīng)商系統(tǒng),直連平臺(tái)需要控制流向供應(yīng)商的請(qǐng)求速度,一般會(huì)通過限流機(jī)制來(lái)實(shí)現(xiàn)。限流的作用是控制在單位時(shí)間向提交不超過一定閾值的請(qǐng)求量,即使用削峰填谷的思路,解決突發(fā)流量的問題,保證直連平臺(tái)整體的出票成功率。

圖9 限流策略(削峰填谷)
當(dāng)供應(yīng)商系統(tǒng)的指標(biāo)連續(xù)出現(xiàn)異常時(shí),為了減少或阻斷持續(xù)的影響,常見的做法是采用熔斷機(jī)制。若系統(tǒng)檢測(cè)到熔斷發(fā)生,一般會(huì)采取降級(jí)處理。在直連平臺(tái)中,熔斷分系統(tǒng)熔斷和業(yè)務(wù)熔斷。系統(tǒng)熔斷是當(dāng)直連平臺(tái)檢測(cè)到供應(yīng)商系統(tǒng)持續(xù)異常時(shí)會(huì)通過一定時(shí)間的禁售等降級(jí)操作來(lái)減少出票失敗量;而業(yè)務(wù)熔斷則是通過分析并標(biāo)準(zhǔn)化供應(yīng)商接口返回的錯(cuò)誤信息,并進(jìn)行相應(yīng)降級(jí)操作。

圖10 熔斷降級(jí)
3.2.2 限流
常見限流算法
常見的限流算法有計(jì)數(shù)器算法、令牌桶算法和漏桶算法。
計(jì)數(shù)器算法是限流算法里最簡(jiǎn)單、最容易實(shí)現(xiàn)的一種算法,通過控制一段時(shí)間的總請(qǐng)求數(shù)實(shí)現(xiàn)限流;令牌桶算法則是使用一個(gè)存放固定容量令牌的桶,并按照固定速率向桶中添加令牌,請(qǐng)求是否被處理需要看桶中令牌是否足夠;漏桶算法是始終按照固定速率處理請(qǐng)求。
計(jì)數(shù)器算法和令牌桶算法控制處理請(qǐng)求的平均速度,會(huì)存在一定程度的突發(fā)流量,而漏桶算法是固定速度,所以直連平臺(tái)采用漏桶算法來(lái)解決不同供應(yīng)商的限流需求。
漏桶限流
用戶訂單產(chǎn)生后,直連平臺(tái)需要從隊(duì)列中批量讀取數(shù)據(jù),向供應(yīng)商批量分發(fā),常常會(huì)出現(xiàn)瞬時(shí)流量影響對(duì)方系統(tǒng)的穩(wěn)定性。通過漏桶限流方案,實(shí)現(xiàn)勻速分發(fā),保證供應(yīng)商系統(tǒng)的平穩(wěn)處理。

圖11 漏桶限流前后對(duì)比
具體步驟:根據(jù)限流策略,從數(shù)據(jù)隊(duì)列中獲取指定數(shù)量的訂單,根據(jù)間隔時(shí)間計(jì)算提交時(shí)刻,最后執(zhí)行分時(shí)提交。

圖12 漏桶限流實(shí)現(xiàn)邏輯
平臺(tái)的訂單對(duì)接供應(yīng)商有幾千家。在配置限流策略時(shí),無(wú)需為每一家配置限流策略。平臺(tái)的做法是對(duì)于有限流訴求的供應(yīng)商、訂單量較大的供應(yīng)商和臨時(shí)有營(yíng)銷活動(dòng)的供應(yīng)商配置即可,而其他供應(yīng)商可以使用一個(gè)公共的限速適中的限流策略即可。這樣可以保證重點(diǎn)供應(yīng)商系統(tǒng)的穩(wěn)定性,又可以減少維護(hù)限流策略的費(fèi)力度。
效果展示
下圖為限流后的流量請(qǐng)求結(jié)果。從圖中可明顯看出,支持限流后的直連平臺(tái)可以很平穩(wěn)的控制處理請(qǐng)求的速度。

圖13 限流效果
3.2.3 系統(tǒng)熔斷
熔斷監(jiān)控
系統(tǒng)熔斷的監(jiān)控采用30分鐘長(zhǎng)監(jiān)控和5分鐘短監(jiān)控結(jié)合的方式。長(zhǎng)監(jiān)控用于計(jì)算熔斷時(shí)長(zhǎng),而短監(jiān)控的目的是為了補(bǔ)充長(zhǎng)監(jiān)控的不足,防止把系統(tǒng)已經(jīng)恢復(fù)的供應(yīng)商再次進(jìn)行熔斷。
熔斷時(shí)長(zhǎng)
熔斷時(shí)長(zhǎng)在基礎(chǔ)時(shí)間的基礎(chǔ)上,綜合考慮了異?;虺瑫r(shí)率和連續(xù)熔斷次數(shù)。在對(duì)供應(yīng)商歷史異常時(shí)長(zhǎng)的統(tǒng)計(jì)后得到異常均值時(shí)長(zhǎng)在30分鐘左右,故平臺(tái)設(shè)置熔斷單次時(shí)長(zhǎng)最長(zhǎng)不超過60分鐘。計(jì)算熔斷時(shí)長(zhǎng)的公式為:

- t:基礎(chǔ)時(shí)間(5分鐘)。
- p: 過去30分鐘內(nèi)的異?;虺瑫r(shí)率。
- L(p):由p計(jì)算出的熔斷時(shí)長(zhǎng)等級(jí)。異?;虺瑫r(shí)率越高,則熔斷時(shí)長(zhǎng)等級(jí)越高。
- n:連續(xù)熔斷次數(shù),首次熔斷n=1。資源上線超過24小時(shí),則n重置為0。
3.2.4 業(yè)務(wù)熔斷
錯(cuò)誤信息多樣性
直連平臺(tái)對(duì)接的供應(yīng)商非常多且不同供應(yīng)商接口契約、對(duì)接流程和錯(cuò)誤描述也不盡相同。對(duì)于因“庫(kù)存不足”而失敗的下單響應(yīng)報(bào)文,直連平臺(tái)可能是根據(jù)供應(yīng)商返回的不同code區(qū)分的,也有可能是需要通過錯(cuò)誤描述來(lái)區(qū)分的,如“庫(kù)存數(shù)量不足”、“余票不足”、“沒有庫(kù)存”、“還剩0張”、“已售罄”等等。

圖14 庫(kù)存不足”對(duì)應(yīng)的供應(yīng)商錯(cuò)誤信息
接口的錯(cuò)誤信息有很多用途,如監(jiān)控供應(yīng)商系統(tǒng)的穩(wěn)定性、歸納對(duì)客失敗話術(shù)、反映商品設(shè)置錯(cuò)誤、反映用戶錯(cuò)誤輸入、提醒補(bǔ)庫(kù)存、關(guān)閉班期或下線資源等?;诠?yīng)商接口錯(cuò)誤信息的分析和處理對(duì)于商品力、系統(tǒng)監(jiān)控、用戶體驗(yàn)等方面都有非常重要作用。
錯(cuò)誤分類
直連平臺(tái)把業(yè)務(wù)錯(cuò)誤分為6個(gè)大類,分別是系統(tǒng)問題、游客信息問題、限購(gòu)問題、庫(kù)存問題、產(chǎn)品設(shè)置問題和賬戶余額問題。每個(gè)大類有分為若子類,在子類上可以配置通知接收人、通知方式、資源操作方式、對(duì)客話術(shù)code等。比如對(duì)于下單接口,只需要把不同供應(yīng)商下單接口錯(cuò)誤信息中的關(guān)鍵詞關(guān)聯(lián)到相應(yīng)的二級(jí)分類上,平臺(tái)即可基于分類進(jìn)行統(tǒng)一的操作。

圖15 錯(cuò)誤分類演示
為了關(guān)鍵詞更加精確地識(shí)別指定供應(yīng)商的錯(cuò)誤信息,關(guān)鍵詞的配置工作必須要人工進(jìn)行。相同的錯(cuò)誤描述對(duì)于不同供應(yīng)商可能有著不同的含義,如:“處理錯(cuò)誤”或某個(gè)具體的錯(cuò)誤碼等。
直連平臺(tái)會(huì)監(jiān)控關(guān)鍵詞匹配率,并每日拉取增量的未匹配關(guān)鍵詞的供應(yīng)商錯(cuò)誤信息,由運(yùn)營(yíng)進(jìn)行補(bǔ)充到供應(yīng)商的關(guān)鍵詞策略中。
降級(jí)方式
目前降級(jí)方式僅支持禁售,禁售包括關(guān)閉班期和下線資源。供應(yīng)商返回“庫(kù)存不足”、“日期不可售”等錯(cuò)誤時(shí),平臺(tái)將會(huì)對(duì)資源操作關(guān)閉班期,供應(yīng)商返回“預(yù)存款不足”、“價(jià)格設(shè)置錯(cuò)誤”等錯(cuò)誤時(shí),平臺(tái)將下線資源。
3.2.5 成果
通過系統(tǒng)熔斷和業(yè)務(wù)熔斷,有效的規(guī)避了因供應(yīng)商系統(tǒng)異常、庫(kù)存不足、賬戶余額不足等等問題造成出票失敗的問題,異常或超時(shí)失敗率從0.34%下降到0.05%。

圖16 系統(tǒng)熔斷效果
四、結(jié)語(yǔ)
引入沙箱后,接入OpenApi的供應(yīng)商不再受制于直連平臺(tái)的人力,上線效率明顯提升,但由于目前沙箱文檔中對(duì)沙箱頁(yè)面使用流程和常見問題的介紹仍不夠詳盡,還需要平臺(tái)人力為供應(yīng)商解答諸多類似問題,故需要進(jìn)一步完善。
熔斷監(jiān)控能有效減少出票失敗率,但熔斷監(jiān)控只依賴下單接口的狀態(tài),由于部分供應(yīng)商已接入可定檢查或預(yù)下單等實(shí)時(shí)接口,所以增加監(jiān)控更多接口數(shù)據(jù)能更加有效地提高監(jiān)控的實(shí)時(shí)性。而且除了禁售,熔斷策略還可以補(bǔ)充其他操作,如變更確認(rèn)方式等。
此外,隨著供應(yīng)商數(shù)量和業(yè)務(wù)邏輯復(fù)雜度的增加,現(xiàn)有監(jiān)控和預(yù)警機(jī)制有待進(jìn)一步完善。當(dāng)前預(yù)警手段還比較依賴郵件,而告警郵件數(shù)量增多,會(huì)增加告警觸達(dá)率低和響應(yīng)不及時(shí)的風(fēng)險(xiǎn)。故需要基于平臺(tái)現(xiàn)有邏輯埋點(diǎn),通過公司成熟且完善的一系列組件對(duì)監(jiān)控和預(yù)警做進(jìn)一步升級(jí)。
最后,希望本文中提到的解決方案能給大家?guī)?lái)幫助和啟發(fā)。





































