【NCTS峰會(huì)回顧】京東零售侯磊:從鏈路化壓測(cè)到流量回放的平臺(tái)實(shí)踐
2019年10月26日,由Testin云測(cè)主辦的第二屆NCTS中國(guó)云測(cè)試行業(yè)峰會(huì)在京召開(kāi),此次峰會(huì)以“AI+未來(lái)”為主題,匯聚來(lái)自國(guó)內(nèi)外測(cè)試領(lǐng)域的知名專(zhuān)家學(xué)者、領(lǐng)先企業(yè)決策者、高層技術(shù)管理者、媒體從業(yè)者等,共同探討高端云測(cè)試技術(shù),幫助測(cè)試從業(yè)者了解最前沿行業(yè)趨勢(shì),及最新的行業(yè)實(shí)踐。
會(huì)上,京東零售技術(shù)與數(shù)據(jù)中臺(tái)測(cè)試架構(gòu)師侯磊做《從鏈路化壓測(cè)到流量回放的平臺(tái)實(shí)踐》主題演講。侯磊介紹了京東在鏈路化壓測(cè)方面的實(shí)踐以及今年在工具上的演進(jìn),并指出,“開(kāi)源社區(qū)星級(jí)最高的往往不是技術(shù)最牛、最好、最新穎的,而是論壇最豐富、社區(qū)最活躍,文檔最全面的。當(dāng)整個(gè)團(tuán)隊(duì)的能力逐步提升后,測(cè)試工具要想脫穎而出拼的就是運(yùn)營(yíng)了。”
以下為侯磊演講實(shí)錄:
謝謝大家,謝謝Testin云測(cè)給我這樣一個(gè)機(jī)會(huì)和大家分享。和前兩位講師相比我的主題更細(xì)節(jié)一些、更專(zhuān)業(yè)一點(diǎn)。今天演講的主題是《從鏈路化壓測(cè)到流量回放的平臺(tái)實(shí)踐》。鏈路化壓測(cè)去年、前年講過(guò)很多次了,去年TID上也做過(guò)這樣一個(gè)平臺(tái)的分享,今天在Testin云測(cè)主場(chǎng)不以分享工具為主了,還是說(shuō)壓測(cè)方面的東西,以及今年在工具演進(jìn)上做了哪些嘗試,也是強(qiáng)業(yè)務(wù)相關(guān)的。開(kāi)始之前,我先問(wèn)一下大家真正做業(yè)務(wù)測(cè)試的有多少?做工具開(kāi)發(fā)類(lèi)的呢?如果都沒(méi)有舉手的就是領(lǐng)導(dǎo)了,大家注意一下周?chē)念I(lǐng)導(dǎo),可能他們需要挖人了。
我本人做開(kāi)發(fā)出身,對(duì)工具平臺(tái)會(huì)更游刃有余一點(diǎn),今天還是把PPT做了一些調(diào)整。從性能測(cè)試開(kāi)始主要分三個(gè)方面,先介紹一下鏈路化測(cè)試,再介紹一下我們平臺(tái)是如何應(yīng)對(duì)鏈路化測(cè)試的,最后是今年一個(gè)新的嘗試點(diǎn),流量回放。
說(shuō)到流量,錄制的方式其實(shí)有很多,我們從很多地方都可以錄制流量,大家也都做很多嘗試,比如java中的AOP攔截、機(jī)器運(yùn)維手段(tcpcopy)、或者從LB層也可以。而今天我所講的這個(gè)流量回放還是從全鏈路角度,從公司入口交換機(jī)上錄流量,這樣的錄制的和基于應(yīng)用服務(wù)器的錄制還是有些區(qū)別的。
首先看鏈路壓測(cè),在京東性能測(cè)試有幾個(gè)發(fā)展階段,最初是線(xiàn)下測(cè)試,在這個(gè)階段由各個(gè)功能團(tuán)隊(duì)執(zhí)行性能測(cè)試,大家用的工具也比較分散,主要用于線(xiàn)下問(wèn)題的定位、新部署系統(tǒng)的性能的評(píng)估,再往后,發(fā)現(xiàn)線(xiàn)下的測(cè)試不能滿(mǎn)足線(xiàn)上的需求,線(xiàn)下的場(chǎng)景也不能復(fù)現(xiàn)線(xiàn)上的問(wèn)題,同時(shí)mock的過(guò)程比較繁瑣復(fù)雜。之后轉(zhuǎn)為線(xiàn)上測(cè)試,再由線(xiàn)上的單點(diǎn)測(cè)試向集群測(cè)試過(guò)渡。在線(xiàn)上測(cè)試的時(shí)候,大家都會(huì)面臨同樣的問(wèn)題——寫(xiě)流量,寫(xiě)流量就要做系統(tǒng)改造,這也是一個(gè)非常復(fù)雜,非常艱難的一步,上次分享的時(shí)候,大家都在問(wèn)這樣的問(wèn)題,系統(tǒng)改造應(yīng)該從何入手?我們改造的困難在哪兒?這個(gè)我在后面也會(huì)再提到。再之后,就是一些場(chǎng)景化,我們除了壓?jiǎn)谓涌?、壓?jiǎn)畏?wù),逐漸向組合業(yè)務(wù)、組合接口,包括剛才陸老師說(shuō)到的BDD,這樣一個(gè)在壓測(cè)場(chǎng)景的應(yīng)用。
現(xiàn)在開(kāi)始做鏈路化壓測(cè),鏈路化壓測(cè)又分為系統(tǒng)的鏈路和業(yè)務(wù)鏈路,這兩個(gè)怎么理解?比如,壓一個(gè)服務(wù),這個(gè)服務(wù)會(huì)調(diào)我的緩存、調(diào)數(shù)據(jù)庫(kù)、調(diào)其它中間件,這樣就形成一個(gè)基于系統(tǒng)的流量的傳輸,這是天然形成的一個(gè)系統(tǒng)鏈路。業(yè)務(wù)鏈路呢?壓一個(gè)接口,這個(gè)接口可能會(huì)調(diào)其他的接口,接口A調(diào)接口B,也可能調(diào)接口C,B有可能又調(diào)接口C,這樣形成一個(gè)業(yè)務(wù)的鏈路。
在這個(gè)基礎(chǔ)之上,如果我同時(shí)對(duì)ABC三個(gè)服務(wù)進(jìn)行壓測(cè),或者說(shuō)從多個(gè)入口進(jìn)行壓測(cè),就會(huì)形成一個(gè)全鏈路的網(wǎng)狀的流量結(jié)構(gòu)。大家可以看這樣一個(gè)圖,如果壓一個(gè)APP,它會(huì)調(diào)它的服務(wù)層,這樣從一個(gè)入口進(jìn)行壓測(cè)的話(huà)會(huì)訪(fǎng)問(wèn)多中間層,最后到持久化。如果從多個(gè)入口同時(shí)壓測(cè)的話(huà),比如壓APP1和web3,service2就可能會(huì)成為一個(gè)瓶頸。單壓任何一個(gè)接口TPS都會(huì)很高,在組合情況下,service2可能成為多場(chǎng)景的短板,所以鏈路化壓測(cè)就是要找到整個(gè)系統(tǒng)里面在全流量進(jìn)行高峰訪(fǎng)問(wèn)時(shí),到底哪些系統(tǒng)是短板,哪些應(yīng)用的資源過(guò)剩了,做資源調(diào)整。比較典型的是京東開(kāi)了海外站,海外和國(guó)內(nèi)是有區(qū)別的,國(guó)內(nèi)APP是主要的入口,泰國(guó)、印尼沒(méi)有發(fā)展到這個(gè)階段,PC就是主要的入口,這樣的流量特點(diǎn)就會(huì)造成我們系統(tǒng)的資源分布是不同的,我們?cè)诤M庹旧暇€(xiàn)之前要對(duì)海外站做全鏈路壓測(cè),找到系統(tǒng)里面到底哪些資源需要做調(diào)整。因?yàn)樵陧?xiàng)目中,每個(gè)業(yè)務(wù)條線(xiàn)、每個(gè)開(kāi)發(fā)都盡可能要更多的資源保證自己的系統(tǒng)不掛,而作為項(xiàng)目管理者,需要統(tǒng)籌規(guī)劃,做好資源調(diào)整使資源達(dá)到平衡狀態(tài),最大化的發(fā)揮價(jià)值,節(jié)約成本。
所以說(shuō)鏈路化壓測(cè)主要是以下幾個(gè)意義,首先是做整體流量的評(píng)估,我們的系統(tǒng)預(yù)期今年的雙十一、618能夠扛住多少量?我系統(tǒng)的短板是什么?其次是根據(jù)我的短板怎么再做資源的調(diào)配,讓我們的木桶盡可能盛裝更多的水,這是鏈路化壓測(cè)的目的。
基于這樣的目的,我們的工具平臺(tái)又需要做哪些改進(jìn)呢?首先看我們的鏈路化壓測(cè)的核心需求,海量用戶(hù)的模擬,鏈路化壓測(cè)區(qū)分于以往的單機(jī)壓測(cè)和集群壓測(cè),我們的目標(biāo)群體是我們的主站上的所有應(yīng)用,所以我們也需要有等量的壓力機(jī)或者等量的用戶(hù)發(fā)起流量訪(fǎng)問(wèn),海量用戶(hù)的模擬是必不可少的。第二點(diǎn)就是鏈路化發(fā)壓的時(shí)候,壓測(cè)團(tuán)隊(duì)是多個(gè)團(tuán)隊(duì)一起進(jìn)行發(fā)壓,如果有一條業(yè)務(wù)線(xiàn)壓測(cè)的系統(tǒng)扛不住了,就需要降級(jí)或者需要減流量,另一種可能是有一條業(yè)務(wù)線(xiàn)的壓測(cè)沒(méi)有達(dá)標(biāo)需要增加的流量,則需要把所有的任務(wù)都停止從頭再來(lái),這樣的效率是不可接受的,所以要?jiǎng)討B(tài)的調(diào)整某一個(gè)接口、某一些流量的訪(fǎng)問(wèn)量。第三點(diǎn)就是要模擬秒殺以及復(fù)合場(chǎng)景。隨著京東組織架構(gòu)的調(diào)整也經(jīng)歷過(guò)工具的變革,最初是有很多工具,各個(gè)業(yè)務(wù)功能團(tuán)隊(duì)執(zhí)行性能測(cè)試,所以各自選型、各自為戰(zhàn),用的很多工具都有。第二階段,隨著京東業(yè)務(wù)量的提升,大促618、雙十一的備戰(zhàn),組建專(zhuān)職的性能測(cè)試團(tuán)隊(duì),這個(gè)在業(yè)界是比較少的,有專(zhuān)門(mén)性能測(cè)試團(tuán)隊(duì),就有專(zhuān)門(mén)的經(jīng)驗(yàn)積累以及工具的沉淀,大家選型三款工具,它們各有特點(diǎn),jmeter上手比較方便。ngrinder是一家韓國(guó)的開(kāi)源工具,這款工具第一次把壓力機(jī)資源池、腳本資源池管理起來(lái),這樣的性能工具在項(xiàng)目管理上,知識(shí)沉淀上,是有優(yōu)勢(shì)的。gatling發(fā)壓效率比較高。但是,這三款工具都不能滿(mǎn)足鏈路化壓測(cè)的要求,我們做了一個(gè)自己的壓測(cè)平臺(tái),也是參考了很多壓測(cè)工具的實(shí)現(xiàn)方式,這一點(diǎn)還得再說(shuō)一下,在上次的分享之后,很多朋友都會(huì)問(wèn),京東的這個(gè)平臺(tái)什么時(shí)候?qū)ν忾_(kāi)放?開(kāi)始很高興加了很多微信,聊著聊著發(fā)現(xiàn)大家不是真的想做我們的用戶(hù),而是擔(dān)心京東什么時(shí)候會(huì)成為競(jìng)爭(zhēng)對(duì)手?這個(gè)我們目前是沒(méi)有這樣的計(jì)劃的,我們還是一個(gè)對(duì)內(nèi)的工具,我們也是希望借這樣的機(jī)會(huì)跟大家交流工具的實(shí)踐,因?yàn)槲冶旧硎亲龉ぞ唛_(kāi)發(fā)的。這個(gè)大家可以放心,Testin云測(cè)這邊也沒(méi)有任何競(jìng)爭(zhēng)的關(guān)系。作為一個(gè)商業(yè)工具來(lái)說(shuō),它的門(mén)檻還是很高的,對(duì)內(nèi)的測(cè)試工具即使功能再完善,可能對(duì)于用戶(hù)的易用性還不是那么好,只是功能性多一點(diǎn)。
測(cè)試工具想在公司內(nèi)推廣,對(duì)公司每個(gè)組件、每個(gè)功能點(diǎn)都要支持,要支持?jǐn)?shù)據(jù)庫(kù)、支持消息中間件,測(cè)試人員也會(huì)提一些需求,甚至要一些智能化的東西,比如,自動(dòng)尋找備測(cè)系統(tǒng)最大的處理TPS,這個(gè)是逐漸增加并發(fā)實(shí)現(xiàn)的,有一些自動(dòng)停止的條件,比如,錯(cuò)誤率是多少停止發(fā)壓了,響應(yīng)時(shí)間多少就停止發(fā)壓。還有一種資源的調(diào)配,對(duì)壓力機(jī)的資源、項(xiàng)目管理、對(duì)于測(cè)試計(jì)劃、測(cè)試預(yù)警。還有作為一個(gè)壓測(cè)平臺(tái)也需要有一個(gè)整個(gè)性能測(cè)試的生態(tài),包括監(jiān)控,日志、性能調(diào)優(yōu)的診斷工具,所有這些工具要在平臺(tái)里做一個(gè)匯總。
因?yàn)槲沂亲龉ぞ叩?,如果大家也是做工具的,可能也?huì)遇到這樣的問(wèn)題,每個(gè)業(yè)務(wù)部門(mén)都會(huì)做自己的工具,接口測(cè)試工具、測(cè)試腳本管理、測(cè)試用例管理,每個(gè)部門(mén)都有自己的工具,做完這個(gè)工具又會(huì)面臨一個(gè)推廣的問(wèn)題,跟同公司或者跟同業(yè)競(jìng)爭(zhēng)的問(wèn)題。性能測(cè)試工具相對(duì)于功能來(lái)說(shuō)可能還好一點(diǎn),因?yàn)檫@個(gè)門(mén)檻稍微會(huì)高一些。比如大家都會(huì)做性能測(cè)試,也都了解線(xiàn)程和進(jìn)程,但是讓大家真能說(shuō)出來(lái)在性能測(cè)試?yán)锩媸裁磿r(shí)候用多線(xiàn)程并發(fā)、什么時(shí)候多進(jìn)程并發(fā),不是那么好回答的問(wèn)題,所以做性能測(cè)試工具的時(shí)候,也是有一些難度的同樣的需求,各個(gè)部門(mén)都會(huì)做工具,你的工具有什么突出點(diǎn)?首先一點(diǎn)還是技術(shù)的保障、技術(shù)的壁壘,這就是forcebot在京東內(nèi)部的不可替代性。首先是海量用戶(hù)的操作,下面我會(huì)介紹實(shí)現(xiàn)過(guò)程。另外一個(gè)是動(dòng)態(tài)增減并發(fā)用戶(hù)數(shù),可以看到如圖,這是模擬雙十一的效果,在雙十一0點(diǎn)的時(shí)候響應(yīng)的請(qǐng)求突然有一個(gè)遞增的效果,這就是秒殺活動(dòng),這個(gè)秒殺會(huì)持續(xù)一段時(shí)間,然后逐漸的減少,過(guò)一段時(shí)間可能有一個(gè)新的二次秒殺活動(dòng),這個(gè)流量又會(huì)上去,再逐漸的往下降,這是一個(gè)場(chǎng)景的模擬。為什么有這種場(chǎng)景?因?yàn)槲覀兊南到y(tǒng)現(xiàn)在做的很智能,我們要?jiǎng)討B(tài)的縮容、增容,我們?cè)诿霘⒅蟮亩位顒?dòng),二次洪峰來(lái)臨的時(shí)候系統(tǒng)能不能扛住新的流量,這也是性能測(cè)試?yán)锩嫘枰M的場(chǎng)景,做這個(gè)平臺(tái)就需要支持這樣的功能。
如圖這是一個(gè)平臺(tái)實(shí)現(xiàn)的基礎(chǔ)架構(gòu),就不詳細(xì)說(shuō)了,其中有一點(diǎn)是任務(wù)調(diào)度服務(wù),通過(guò)它的水平擴(kuò)展支持海量的壓力機(jī)進(jìn)行并發(fā)的發(fā)壓。
還是說(shuō)一點(diǎn)我自身做工具的感想,做工具如果在內(nèi)部推廣最好有一個(gè)護(hù)城河。首先就是技術(shù)的門(mén)檻。如果讓一般的測(cè)試工程師來(lái)做一些工具的開(kāi)發(fā),封一個(gè)頁(yè)面,或者通過(guò)運(yùn)維腳本驅(qū)動(dòng)單機(jī)測(cè)試工具達(dá)到集成的效果,或者用一些開(kāi)源工具包一層,這是大家最擅長(zhǎng)、最容易做的。如果再提高一步做一些改良,例如多線(xiàn)程并發(fā)、流式計(jì)算,可能對(duì)于測(cè)試工程師來(lái)說(shuō)這個(gè)門(mén)檻就稍微高了一點(diǎn)點(diǎn),這是我作為工具開(kāi)發(fā)的一點(diǎn)兒體會(huì)/心得。第二個(gè)護(hù)城河是當(dāng)整個(gè)測(cè)試能力逐步提升后,拼的就是運(yùn)營(yíng)和維護(hù)了,開(kāi)源社區(qū)星級(jí)最高的往往不是技術(shù)最牛、最好、最新穎的,而是論壇最豐富、社區(qū)最活躍,文檔最全面的。在提升后,測(cè)試工具要想脫穎而出拼的就是運(yùn)營(yíng)了。
再回到系統(tǒng)里來(lái),這里面有幾個(gè)難點(diǎn),1、海量數(shù)據(jù)的模擬,多并發(fā)就是通過(guò)海量的壓力機(jī)、多線(xiàn)程、多進(jìn)程實(shí)現(xiàn)。在雙十一要想模擬百萬(wàn)級(jí)用戶(hù),至少需要四五千臺(tái)壓力機(jī),每臺(tái)壓力機(jī)線(xiàn)程、進(jìn)程也看容器的規(guī)格,好一點(diǎn)的機(jī)器支持并發(fā)多一點(diǎn),差一點(diǎn)的機(jī)器一百并發(fā)就到頭了。2、數(shù)據(jù)的收集,這是性能測(cè)試工具都會(huì)面臨的問(wèn)題,在jmeter為了精確計(jì)算TB99,會(huì)把每個(gè)響應(yīng)時(shí)間都生成在文件里面,傳給它的master,這樣就造成了網(wǎng)絡(luò)傳輸?shù)膯?wèn)題和計(jì)算問(wèn)題。ngrinder有了進(jìn)一步的改造,它按秒收集單臺(tái)壓力機(jī)每個(gè)請(qǐng)求的響應(yīng)時(shí)間,做一個(gè)匯總,求平均后再交給controller,由controller再進(jìn)行二次平均,進(jìn)行計(jì)算,當(dāng)然這個(gè)數(shù)就有些失真了,所以我們?cè)谶@里做了一點(diǎn)改進(jìn)。首先還是數(shù)據(jù)合并,在壓力機(jī)上把每個(gè)請(qǐng)求的響應(yīng)時(shí)間都做了匯總,這個(gè)匯總不是求平均,而是做了數(shù)據(jù)壓縮,把每一個(gè)響應(yīng)時(shí)間的次數(shù)統(tǒng)計(jì)一下,把這個(gè)key-value的數(shù)據(jù)傳到我們監(jiān)控的平臺(tái)上,這樣傳輸?shù)臄?shù)據(jù)量變小了,同時(shí)在計(jì)算的時(shí)候,只要對(duì)map的key值進(jìn)行計(jì)算就可以了,這是中間的小技巧。
還有作為一個(gè)壓測(cè)的生態(tài)來(lái)說(shuō),監(jiān)控是必不可少的,除了對(duì)壓力機(jī)的監(jiān)控還有被測(cè)服務(wù)的監(jiān)控,監(jiān)控的內(nèi)容包括資源的監(jiān)控還有發(fā)下請(qǐng)求的監(jiān)控,對(duì)于性能監(jiān)控來(lái)說(shuō)一定是秒級(jí)的,往往程序里面GC時(shí)間很短,在頻繁GC的情況下,壓測(cè)圖形的秒級(jí)監(jiān)控會(huì)形成一個(gè)鋸齒狀。另外在GC的時(shí)候,還有可能TPS就會(huì)掉0,掉坑,這種鋸齒狀的處理能力可能會(huì)造成線(xiàn)上的問(wèn)題,所以壓測(cè)監(jiān)控一定要按照秒級(jí)監(jiān)控。另外一個(gè)要注意的是,發(fā)壓端與被測(cè)端對(duì)比。有時(shí)候出現(xiàn)這種場(chǎng)景:研發(fā)人員很自信:我的監(jiān)控?cái)?shù)據(jù)很好、響應(yīng)時(shí)間OK、可用率100%,但是從發(fā)壓端來(lái)看,發(fā)壓端真正是用戶(hù)感知的,收到的響應(yīng)時(shí)間跟慢,也有很多time out,但是發(fā)壓端的監(jiān)測(cè)是感覺(jué)不到的,這樣的問(wèn)題就需要再定位這是通過(guò)對(duì)比出來(lái)的。這種問(wèn)題的原因有很多,比如網(wǎng)絡(luò)傳輸,序列化和反序列化、系統(tǒng)資源的抖動(dòng)等等,這就需要具體問(wèn)題具體定位,這個(gè)對(duì)于初級(jí)性能測(cè)試人員是往往容易忽略的問(wèn)題。
講完工具,再看看京東是怎么做鏈路化壓測(cè)這種實(shí)踐的,怎么利用forcebot平臺(tái)做全鏈路壓測(cè)的?首先定義一下壓測(cè)的目的:對(duì)容量整體的評(píng)估,對(duì)資源再分配;第二點(diǎn)看壓測(cè)方式:我們的軍演是把壓力機(jī)部署在CDN上,通過(guò)外網(wǎng)模擬真實(shí)用戶(hù),這樣的好處是壓測(cè)鏈路比較長(zhǎng),包括公司負(fù)載均衡、網(wǎng)關(guān)、安全都?jí)旱搅?,但是這套實(shí)施的難點(diǎn)就是數(shù)據(jù)流量的識(shí)別,到底哪些是測(cè)試數(shù)據(jù),這是千萬(wàn)不能影響線(xiàn)上環(huán)境的,也不能給線(xiàn)上帶來(lái)臟數(shù)據(jù),數(shù)據(jù)的改造是每一個(gè)公司都要面臨的問(wèn)題。京東做這件事做了一年多,到現(xiàn)在也繼續(xù)在持續(xù)改造著,上次講完很多朋友都在問(wèn)京東是怎么做的。我再來(lái)解釋一下,最重要的一點(diǎn)是在公司領(lǐng)導(dǎo)層面達(dá)成一致。為了一個(gè)質(zhì)量的改進(jìn)或者質(zhì)量的驗(yàn)證,可能會(huì)犧牲業(yè)務(wù)開(kāi)發(fā)的時(shí)間,公司高層一定要達(dá)成一致意見(jiàn)后再往下推,在推的時(shí)候建議各個(gè)業(yè)務(wù)條線(xiàn)架構(gòu)師配合,如果讓測(cè)試人員做技術(shù)改造可能有點(diǎn)困難,但是測(cè)試人員比較適合做推動(dòng)者和倡導(dǎo)者,因?yàn)楦倪M(jìn)的是我們的質(zhì)量,是跟我們的工作息息相關(guān)的,可以提高測(cè)試效率和效果。最后一定要每周做例會(huì)、回顧、周報(bào)什么的,通過(guò)項(xiàng)目制,把系統(tǒng)改造作為很重要的事推進(jìn)下去。
如圖,我們是這樣做的打標(biāo)流量識(shí)別,首先在測(cè)試之前先準(zhǔn)備一些測(cè)試數(shù)據(jù)、測(cè)試帳號(hào),發(fā)壓的時(shí)候需要打標(biāo),因?yàn)槭悄M用戶(hù)行為,所以一般都是HTTP請(qǐng)求,第一層服務(wù)識(shí)別這個(gè)標(biāo)再進(jìn)行RPC透?jìng)?。這也是看業(yè)務(wù)系統(tǒng)如何改造,如果有能力的話(huà)最好在RPC框架基礎(chǔ)上做流量識(shí)別、流量隔離。如果不方便從業(yè)務(wù)層面改造識(shí)別也是OK的,改造方式其實(shí)有很多,有可能配置一個(gè)影子庫(kù)、影子中間件,有可能就寫(xiě)進(jìn)一個(gè)打標(biāo)的數(shù)據(jù),事后再進(jìn)行清理,這些都是可行的辦法。在京東我們也是每一條線(xiàn)處理的方式有區(qū)別。
最后看鏈路化壓測(cè),每年的雙十一、618都會(huì)做鏈路化壓測(cè),這個(gè)壓測(cè)前前后后可能從準(zhǔn)備到最終實(shí)施要一周多的時(shí)間。準(zhǔn)備的時(shí)候要確認(rèn)壓測(cè)范圍、確定好流量到那個(gè)環(huán)節(jié)就會(huì)停止住了,或者說(shuō)是有哪些入口、哪些系統(tǒng)需要參與壓測(cè)對(duì)于中臺(tái)來(lái)說(shuō),是否需要補(bǔ)量壓測(cè)場(chǎng)景的設(shè)計(jì)和評(píng)審、數(shù)據(jù)的準(zhǔn)備,這就需要花很長(zhǎng)的時(shí)間了。
第二步要在壓測(cè)前,把我們的腳本還有我們的數(shù)據(jù)準(zhǔn)備好,壓測(cè)池的資源分配、壓測(cè)數(shù)據(jù)提前錄制好、準(zhǔn)備好,分發(fā)到壓力機(jī)上,因?yàn)檫@個(gè)數(shù)據(jù)往往都是很大的文件,線(xiàn)上錄制也好,構(gòu)建生成也好,要提前同步到壓力機(jī)上,實(shí)時(shí)拉取可能會(huì)影響效果。還要準(zhǔn)備好我們要壓什么、緊急預(yù)案是什么、發(fā)生問(wèn)題第一聯(lián)系人是誰(shuí)等等,在壓測(cè)前一天晚上,要準(zhǔn)備好小流量的驗(yàn)證,可以先試壓一下,最后再線(xiàn)上流量的驗(yàn)證。實(shí)施階段,我們一般是線(xiàn)上扛量用一個(gè)機(jī)房,壓測(cè)用另外一個(gè)機(jī)房,壓測(cè)流量需要適時(shí)調(diào)整,還有降級(jí)演練,最后還要把壓測(cè)成績(jī)單進(jìn)行匯總。這個(gè)步驟每年都會(huì)很費(fèi)時(shí)、很費(fèi)力,從數(shù)據(jù)準(zhǔn)備到腳本驗(yàn)證再回放,其實(shí)回放可能不會(huì)很長(zhǎng)時(shí)間,但是前期的數(shù)據(jù)準(zhǔn)備、構(gòu)造會(huì)很耗時(shí)。
這就說(shuō)到全鏈路的一個(gè)痛點(diǎn),也就是我們?yōu)槭裁醋隽髁炕胤?,這是今年我們想的一個(gè)平臺(tái)2.0的演進(jìn)。
作為平臺(tái)開(kāi)發(fā)來(lái)說(shuō),鏈路化壓測(cè)做完以后下一步做點(diǎn)什么?業(yè)界都會(huì)想到自動(dòng)化、智能化、常態(tài)化,這樣的 title很大,但是怎么做到呢?我們首先想到從數(shù)據(jù)的準(zhǔn)備到發(fā)壓做成自動(dòng)化,就是流量的錄制和回放。不再需要寫(xiě)腳本和準(zhǔn)備數(shù)據(jù),這樣從真實(shí)環(huán)境上錄制流量,當(dāng)然這個(gè)前提是,業(yè)務(wù)改造一定要相當(dāng)?shù)耐陚淞?,我們?xiě)的流量到底能不能去識(shí)別?這個(gè)是很必要的。其實(shí)做流量回放在京東也是有背景的,在618今年也發(fā)生這樣一件事,之前軍演準(zhǔn)備的時(shí)候,我系統(tǒng)處理的TPS可以達(dá)到很高,但實(shí)際上在流量高峰的時(shí)候,發(fā)現(xiàn)還沒(méi)有到達(dá)這個(gè)TPS,系統(tǒng)資源CPU就已經(jīng)耗盡了。后來(lái),分析原因還是壓測(cè)場(chǎng)景設(shè)計(jì)的不到位,比如,同樣是一個(gè)查詢(xún)用戶(hù)的接口,用戶(hù)信息多和用戶(hù)信息量少,這個(gè)對(duì)于系統(tǒng)來(lái)說(shuō)處理是不同的,我們準(zhǔn)備壓測(cè)場(chǎng)景還沒(méi)有完全覆蓋住真實(shí)的線(xiàn)上狀態(tài),所以這也是驅(qū)動(dòng)我們必須要做這么一件事的原因:真實(shí)的線(xiàn)上的流量回放。
另外一個(gè)方面,剛才也提到了,流量回放不僅僅是單機(jī)對(duì)于單一應(yīng)用的回放,是中臺(tái)和前臺(tái)體系所有入口流量通通進(jìn)行回放,這個(gè)在回放過(guò)程中天然形成一個(gè)配比關(guān)系。以往我們的配比關(guān)系都是專(zhuān)門(mén)分析出來(lái)的,例如同一個(gè)系統(tǒng)里的三個(gè)接口,配比1:3,是通過(guò)分析日志,或者分析以往的流量得到的。而流量回放的時(shí)候,這個(gè)比例是天然形成的,不用再參考、不用再設(shè)計(jì)了。這是一個(gè)巨大的方便優(yōu)勢(shì)。;
第三是切實(shí)做到提效,我們想做常態(tài)化的壓測(cè),想把這種軍演、鏈路化壓測(cè)成為常態(tài)化,除了系統(tǒng)改造,還要實(shí)施的很方便,錄制數(shù)據(jù)不需要研發(fā)配合,不需要在應(yīng)用端抓log,不需要改java代碼攔截流量數(shù)據(jù),回放的時(shí)候也不需要再寫(xiě)腳本了,這是一個(gè)常態(tài)化或者說(shuō)自動(dòng)化的前提。其實(shí)從入口上錄的流量還有一個(gè)好處:不再依賴(lài)于被測(cè)系統(tǒng),不再依賴(lài)于線(xiàn)上應(yīng)用。以往我們對(duì)線(xiàn)上應(yīng)用的log錄制的話(huà),在大促的時(shí)候可能是不敢打開(kāi)的,因?yàn)闀?huì)影響線(xiàn)上的性能,但是如果我們從入口交換機(jī)分光出來(lái)的流量對(duì)業(yè)務(wù)是完全無(wú)侵?jǐn)_的,可以隨時(shí)隨地的錄,這也是它的好處之一。
最終達(dá)到這樣一個(gè)效果,線(xiàn)上流量錄制,然后放在數(shù)據(jù)中心再做壓測(cè)流量的回放。
如圖,這是我們實(shí)現(xiàn)的一個(gè)架構(gòu),其實(shí)我們也在實(shí)踐階段,方案并不是很完備,更多實(shí)現(xiàn)細(xì)節(jié)我也就不再詳細(xì)的介紹了,主要還是這樣幾個(gè)模塊,抓取模塊從分光器上把流量抓取,到一個(gè)性能非常好的消息隊(duì)列里面,之后再增加一個(gè)安全模塊。線(xiàn)上數(shù)據(jù)安全性問(wèn)題是非常重要的,在互聯(lián)網(wǎng)行業(yè),安全再怎么做都不會(huì)過(guò)分,因?yàn)橛脩?hù)安全可能會(huì)有各種各樣的問(wèn)題。最后落盤(pán)到京東一個(gè)分布式系統(tǒng)里面,大家可以用自己公司的文件系統(tǒng),這個(gè)加密后的數(shù)據(jù)也可以放到內(nèi)網(wǎng)回放,甚至用于功能回放都是OK的。具體怎么用,依賴(lài)于域名的過(guò)濾,根據(jù)自己的系統(tǒng)適配就行了,回放的時(shí)候可以用個(gè)固定的腳本,把錄制的東西當(dāng)作參數(shù)化文件進(jìn)行發(fā)壓。
最后做一個(gè)比喻,流量錄制回放相當(dāng)于蓄水池的概念,用幾個(gè)小時(shí)的時(shí)間把線(xiàn)上數(shù)據(jù)錄制下來(lái)集中存放,然后再用很短的時(shí)間集中釋放,達(dá)到模擬洪峰來(lái)臨的效果。今年在雙十一備戰(zhàn)上我們的流量錄制已經(jīng)在開(kāi)始用了,效果還是可以的,很多業(yè)務(wù)的配比關(guān)系直接用這樣的真實(shí)數(shù)據(jù)了,業(yè)務(wù)的測(cè)試也比較輕松了,不用再寫(xiě)很多腳本了,也不用再向研發(fā)要這種參數(shù)數(shù)據(jù)了。
最后有一點(diǎn)想說(shuō)的是,“醉里挑燈看劍,夢(mèng)回吹角連營(yíng)。”線(xiàn)上各種各樣的狀態(tài)牽動(dòng)著測(cè)試人員的心,希望大家還是用自己的技術(shù)改變公司的質(zhì)量文化、質(zhì)量氛圍,從自己做起。謝謝大家!