干货 | 携程酒店MOCK全链路实践
作者簡介
劉曉攀,攜程酒店性能測試負責人,專注性能測試分析和輔助測試工具的開發(fā)。
一、前言
Mock在整個軟件開發(fā)測試周期中已經(jīng)非常普遍,我們也會經(jīng)常有意無意地使用它。譬如開發(fā)了一段代碼,這段代碼強依賴了其他服務(wù),在對方服務(wù)完成之前,肯定是期望代碼能夠同步開發(fā)。那么在開發(fā)的過程中一定會根據(jù)約定固定對方服務(wù)的返回,這種在代碼中的模擬行為,是一種mock。
另外當前很多應(yīng)用為了提高性能,普遍采用cache的方式。有些cache數(shù)據(jù)是需要很多database的數(shù)據(jù)經(jīng)過一定的邏輯運算得到的,而在測試過程中,為了快速驗證測試場景,直接取修改cache數(shù)據(jù)的方式,也是一種mock。
在當前五花八門的mock方式中,我們希望有一種方便快捷的mock方式,便于開發(fā)測試使用,特別是對于多依賴、多變化的場景,更需要mock的協(xié)助。否則將需要打通一系列的外部依賴來滿足一個場景的需要。
于是,我們推出了mock全鏈路。mock全鏈路既是一種mock方式,又是mock在不同階段的擴展使用。當然 mock全鏈路還面臨著一些些問題,我們將在后面的章節(jié)中詳細展開。
二、技術(shù)背景
技術(shù)的進步更多源于底層技術(shù),比如正是由于蒸汽機的發(fā)明,才有了現(xiàn)在各式各樣的機動車,挖土機,收割機等等,工業(yè)上各種技術(shù)也有了不同形式的發(fā)展。同理,酒店mock也是伴隨著基礎(chǔ)架構(gòu)、日志系統(tǒng)的更新?lián)Q代而不斷發(fā)展。
mock全鏈路就是在框架能夠完整跟蹤應(yīng)用調(diào)用鏈,指定header在鏈路上無限透傳,ES日志系統(tǒng)大范圍應(yīng)用的背景下產(chǎn)生的 。當然不管mock怎么變化,最基礎(chǔ)的原理還是建立在常規(guī)mock的基礎(chǔ)上的(如圖1)。
圖1 常規(guī)mock示意圖首先在多依賴的應(yīng)用中,特別是強依賴服務(wù)的業(yè)務(wù)邏輯比較復(fù)雜,依賴服務(wù)所在的組還有一堆任務(wù)的情況下,通過構(gòu)造打通依賴服務(wù)的行為會變得非常耗時。嚴重的時候,會拖累整個項目的進度。
ES在公司的大規(guī)模應(yīng)用,為我們解決此類問題提供了契機。ES的埋點數(shù)據(jù)為mock提供了很好的種子。框架的鏈路完整埋點為全鏈路提供最基礎(chǔ)的管道,沒有這個最基礎(chǔ)的管道,所有的鏈路都將是模糊不清,無法識別的。同時 header在鏈路中的透傳為整個mock實現(xiàn)鋪平了道路,使得mock能夠快速根據(jù)header中的規(guī)則來識別不同的鏈路調(diào)用。
測試的不同場景在這里也有了很好的區(qū)分。而這些數(shù)據(jù)又都可以在ES中通過埋點來解決。mock可以通過ES API把這些數(shù)據(jù)拉來使用,從而基礎(chǔ)的API調(diào)用鏈路已經(jīng)成形并且明晰。這就為后續(xù)的實現(xiàn)打下基礎(chǔ)。
基礎(chǔ)調(diào)用鏈路圖如下:
Es鏈路埋點如圖2所示:
圖2 ES埋點鏈路示意圖?
當所有的鏈路設(shè)施都準備好之后,影響整個使用過程的就是怎么樣把mock快速無縫的切入真實調(diào)用鏈路。
我們知道,無論是slb還是ip直連,最基本的原理還是所有的服務(wù)都需要注冊,注冊的最終目的就是所有的服務(wù)中心化。當調(diào)用依賴服務(wù)的時候,在中心里獲取對方的服務(wù),提供給調(diào)用方使用。
這樣的情況下,應(yīng)用切入mock最直接的想法就是把中心中依賴方地址修改成mock地址,當然這就需要框架提供支持。這是一種侵入式的mock應(yīng)用方法。
另外一種方式是通過PROXY,類似于網(wǎng)絡(luò)代理,所有經(jīng)過代理的網(wǎng)絡(luò)包在代理中進行收編和整理,該走mock的走mock,不走mock的放回原來的網(wǎng)絡(luò)中。這種方式是當前相對比較理想的方式。把對應(yīng)用的侵入,變成系統(tǒng)層面配置的更改,相對適應(yīng)性更強一些。
綜上兩點解決后,整個mock鏈路的基本技術(shù)方案有了一個比較可行的落點。mock全鏈路的整體架構(gòu)如圖3。
圖3 MOCK鏈路架構(gòu)圖三、技術(shù)實現(xiàn)
Mock的技術(shù)實現(xiàn)要注意以下三點:
3.1 Mock的響應(yīng)速度
響應(yīng)速度要滿足服務(wù)調(diào)用基本要求,不能timeout。正常情況下,mock不需要業(yè)務(wù)邏輯處理,只需要做規(guī)則的簡單匹配,響應(yīng)速度要快才對,這是建立在規(guī)則相對少的情況下。
如果在千萬億級的規(guī)則進來之后,規(guī)則的獲取,場景的匹配速度會拖慢整個mock的響應(yīng),現(xiàn)在的mock系統(tǒng)同樣要依賴緩存技術(shù)來提高規(guī)則場景的匹配速度。
另外是pb格式請求,我們要進行多次的序列化和反序列化,來保證配置的明文json或者xml能夠正確的在請求中傳遞,而序列化和反序列化本身就是一個消耗cpu的動作,這會給響應(yīng)造成極大的延遲。
當前情況下,我們盡量提前進行序列化和反序列化操作,操作結(jié)果存入緩存,這樣能夠在此等格式請求傳遞和返回傳遞的過程中,保持快速的字節(jié)流傳遞而不需要額外的序列化反序列化操作。
最后在轉(zhuǎn)發(fā)的情況下,相對正常服務(wù)調(diào)用多了一次網(wǎng)絡(luò)請求,時間消耗相對較長。在這方面我們盡量采用減少連接等待,保持連接狀態(tài)等方式來減少多次socket連接造成的時間損耗。
3.2 契約依賴問題
對于依賴契約的請求格式,如pb等,需要契約的更新速度必須在ES埋點落庫之前。
契約延遲更新是我們面臨的很大問題,契約的不及時更新,會造成數(shù)據(jù)節(jié)點的丟失或者直接調(diào)用報錯。發(fā)布訂閱和編譯包下載替換是我們目前解決這個問題的主要方式。
當前這需要維護一個所有應(yīng)用契約文件的列表,以便我們在編譯包中進行查找替換。而替換動作成功發(fā)生的前提是當前契約文件沒有被進程占用。
3.3?系統(tǒng)操作的易用性 ?
操作簡單是用戶使用的基礎(chǔ),也是系統(tǒng)的目標,當然操作習(xí)慣也會影響系統(tǒng)在不同人群中的使用。但最終的目標,是希望用戶用盡量少的鼠標或者鍵盤動作,來完成整個mock的操作。鏈路使用操作相對簡單是系統(tǒng)能夠被使用的重要環(huán)節(jié)。
譬如ES數(shù)據(jù)拉取,我們采用了只讓用戶輸入ES共享鏈接來代替繁瑣復(fù)雜的ES過濾器配置。
最原始的設(shè)計UI如下圖所示:需要有十幾個配置項需要用戶取配置:
改良后的交互如圖4所示,只需要輸入ES共享連接即可,其余的事情都由系統(tǒng)來協(xié)助用戶完成,從而減少用戶的使用費力度。
圖4 ES數(shù)據(jù)拉取四、面臨的一些問題
在mock全鏈路的使用過程中,遇到一些新的問題,比如在真實調(diào)用鏈中重復(fù)調(diào)用的問題。由于重復(fù)調(diào)用的返回結(jié)果不一致,導(dǎo)致我們在mock全鏈路的時候無法知曉哪個是第一次要返回,哪個是第二次要返回,從而影響全鏈路的真實性。
緩存問題。之前提到過很多應(yīng)用都會在本地或者其他緩存服務(wù)器做數(shù)據(jù)緩存,很多處理邏輯是緩存數(shù)據(jù)存在的情況下,拉取緩存數(shù)據(jù),否則走依賴接口調(diào)用,在mock切入應(yīng)用之后,發(fā)現(xiàn)很多緩存未過期導(dǎo)致mock無法被調(diào)用,從而影響全鏈路的正確性。
轉(zhuǎn)發(fā)302問題。有些服務(wù)需要在服務(wù)API之間做302轉(zhuǎn)發(fā)調(diào)用,而mock正常是要返回http code 200的狀態(tài)的。
針對不同業(yè)務(wù)的問題,我們只能針對性的進行個性化或者通用兼容性修補,在通用系統(tǒng)的基礎(chǔ)上,進行個性業(yè)務(wù)適應(yīng)。
總之,mock全鏈路系統(tǒng)需要在實際業(yè)務(wù)中進行不斷的鍛造、更新,在使用中不斷調(diào)整,從而保證mock全鏈路能夠適應(yīng)不同業(yè)務(wù)的需要。
五、后記
Mock的設(shè)計特別要考慮壓測的需求,壓測對mock系統(tǒng)的要求會更高,所以我們在設(shè)計之初,要把這種需求優(yōu)先考慮,對系統(tǒng)擴展和快速資源擴容留下足夠的空間。
另外匹配規(guī)則的設(shè)計要盡量簡單,譬如正則和xpath, jpath此類的功能,從當前的統(tǒng)計數(shù)據(jù)來看,使用率不高;而簡單的規(guī)則,譬如header匹配,包含等則被用戶大面積使用。
總結(jié)
以上是生活随笔為你收集整理的干货 | 携程酒店MOCK全链路实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬核!如何模拟 5w+ 的并发用户?
- 下一篇: 从七个方面,面试大厂高级工程师