陳皓 張博民
摘? 要:隨著硬件性能的提升、網(wǎng)絡(luò)帶寬的增加和數(shù)據(jù)量的急劇增長(zhǎng),傳統(tǒng)的單機(jī)應(yīng)用已無法滿足現(xiàn)代企業(yè)的需求,取而代之的是基于分布式的軟件系統(tǒng)。這些軟件系統(tǒng)在提供強(qiáng)大計(jì)算能力的同時(shí),也引入了復(fù)雜性。文章介紹一種新型的基于云原生架構(gòu)的生產(chǎn)線上全鏈路壓力測(cè)試方法——Shadow Service,通過實(shí)現(xiàn)業(yè)務(wù)一致性、數(shù)據(jù)一致性、資源一致性和各種隔離性,保證了測(cè)試結(jié)果的準(zhǔn)確性和生產(chǎn)系統(tǒng)的安全性。同時(shí),詳細(xì)介紹了如何在一個(gè)簡(jiǎn)化后的訂單支付場(chǎng)景中使用Shadow Service實(shí)現(xiàn)壓力測(cè)試。
關(guān)鍵詞:生產(chǎn)環(huán)境;壓力測(cè)試;影子服務(wù);服務(wù)網(wǎng)格;云原生
中圖分類號(hào):TP311.5? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):2096-4706(2023)11-0069-04
An End-to-End Pressure Testing Technology for a Completely Invasive Production Line
CHEN Hao, ZHANG Bomin
(MegaEase Inc., Beijing? 100025, China)
Abstract: With the improvement of hardware performance, the big increment in network bandwidth, and the rapid growth of data volume, traditional stand-alone applications can no longer meet the needs of modern enterprises. Instead, distributed-based software systems have emerged. These software systems provide powerful computing capabilities while introducing complexity. This paper introduces a novel cloud-native architecture-based end-to-end pressure testing method for production lines—Shadow Service. By ensuring business consistency, data consistency, resource consistency, and various isolation levels, the accuracy of test results and the security of production systems are guaranteed. At the same time, it details how to use Shadow Service to achieve pressure testing in a simplified order payment scenario.
Keywords: production environment; pressure testing; shadow service; service grid; cloud native
0? 引? 言
在網(wǎng)絡(luò)時(shí)代,一個(gè)大型的互聯(lián)網(wǎng)應(yīng)用需要承受數(shù)以億計(jì)的訪問量,這需要我們對(duì)應(yīng)用中所有的服務(wù)進(jìn)行全面完整的全鏈路壓力測(cè)試,但這面臨著巨大的挑戰(zhàn),傳統(tǒng)測(cè)試方法不僅成本高昂且無法保證準(zhǔn)確性,還需要巨大的工作量并存在破壞生產(chǎn)系統(tǒng)的風(fēng)險(xiǎn)。為了應(yīng)對(duì)這些問題,MegaEase提出了Shadow Service技術(shù),基于云原生的流量調(diào)度和Service Mesh技術(shù),實(shí)現(xiàn)了業(yè)務(wù)一致、數(shù)據(jù)一致、資源一致以及業(yè)務(wù)隔離、數(shù)據(jù)隔離、流量隔離和資源隔離。這種方法不需要修改任何代碼,成本低,能夠保證業(yè)務(wù)邏輯與生產(chǎn)環(huán)境的一致性,同時(shí)可以使用生產(chǎn)數(shù)據(jù)進(jìn)行測(cè)試,保證測(cè)試結(jié)果的準(zhǔn)確性,且安全可靠。因此,Shadow Service成為網(wǎng)絡(luò)時(shí)代全站壓力測(cè)試的理想選擇。
1? 背景介紹
隨著硬件性能越來越強(qiáng),帶寬越來越高,數(shù)據(jù)越來越多,傳統(tǒng)的單機(jī)應(yīng)用已經(jīng)無法滿足用戶需求,取而代之的是由各種組件基于網(wǎng)絡(luò)而構(gòu)成的軟件系統(tǒng)。
但這種軟件系統(tǒng),在帶來更強(qiáng)大的計(jì)算能力的同時(shí),也引入了單機(jī)時(shí)代所不具有的復(fù)雜性。今天,一個(gè)完整的軟件系統(tǒng),模塊數(shù)量少則幾十,多則成千上萬。并且,為了提高開發(fā)上線速度,這些模塊會(huì)由不同的團(tuán)隊(duì)使用不同的語言開發(fā),這也讓模塊間的通信變得更加復(fù)雜。
同時(shí),今天的業(yè)務(wù)模式相比過去也發(fā)生了很大的變化,類似雙十一的促銷活動(dòng),會(huì)讓系統(tǒng)承受數(shù)倍、數(shù)十倍于日常的壓力。所以,壓力測(cè)試變得日益重要,但傳統(tǒng)的測(cè)試方法也變得越來越無法適應(yīng)業(yè)務(wù)需求。
2? 問題和難點(diǎn)
2.1? 專用測(cè)試環(huán)境的問題
在單機(jī)時(shí)代,使用“1:1”的測(cè)試環(huán)境,是非常好的壓力測(cè)試方法。但到了網(wǎng)絡(luò)時(shí)代,這種做法卻可能非常不切實(shí)際。
1)成本問題。要測(cè)試單機(jī)軟件,即使是獨(dú)立開發(fā)者,絕大多數(shù)情況下也可以輕松地購買一臺(tái)獨(dú)立的測(cè)試用計(jì)算機(jī);但今天的系統(tǒng)所需的資源太多了,要想1:1的按照生產(chǎn)系統(tǒng)搭建一套測(cè)試系統(tǒng),單是服務(wù)器成本就會(huì)高的讓大多數(shù)公司難以承受,更不用說還可能有帶寬、電力、機(jī)房等費(fèi)用。
2)環(huán)境問題。即使我們?cè)诔杀旧蠜]有問題,但是真的“1:1”建起測(cè)試環(huán)境,保持這個(gè)測(cè)試環(huán)境與生產(chǎn)環(huán)境的軟件、數(shù)據(jù)完全一致也充滿挑戰(zhàn)。在實(shí)際工作中,測(cè)試環(huán)境與生產(chǎn)環(huán)境的差異會(huì)隨著時(shí)間的推移越來越大,最終導(dǎo)致測(cè)試結(jié)果失真。
3)數(shù)據(jù)問題。我們還會(huì)面對(duì)測(cè)試數(shù)據(jù)的問題,如果不能保證測(cè)試環(huán)境的數(shù)據(jù)與生產(chǎn)環(huán)境接近甚至相同,測(cè)試結(jié)果就不可信。比如一個(gè)類似微博的系統(tǒng),像作者這種普通用戶一般只有幾十或幾百人關(guān)注,所以我發(fā)一條消息,隨便怎么做都可以很容易地通知所有關(guān)注者。但對(duì)一個(gè)千萬大V,情況就會(huì)截然不同。所以,我們不能簡(jiǎn)單地使用模擬數(shù)據(jù)進(jìn)行測(cè)試。
4)安全問題。為了讓測(cè)試結(jié)果真實(shí)可靠,最好能夠把完整的生產(chǎn)數(shù)據(jù)導(dǎo)入到測(cè)試環(huán)境。乍看上去,這只需要簡(jiǎn)單地備份恢復(fù)下數(shù)據(jù)庫,但生產(chǎn)環(huán)境包含大量敏感數(shù)據(jù),隨意復(fù)制到測(cè)試環(huán)境無疑會(huì)極大地增加數(shù)據(jù)泄露的風(fēng)險(xiǎn)。
2.2? 在生產(chǎn)環(huán)境進(jìn)行測(cè)試的問題
因?yàn)槭褂脺y(cè)試環(huán)境進(jìn)行壓測(cè)存在諸多困難,人們就把目光轉(zhuǎn)向了生產(chǎn)環(huán)境,嘗試直接利用生產(chǎn)環(huán)境上的壓力低谷時(shí)段,比如凌晨,進(jìn)行測(cè)試。但這是一種侵入式的解決方案,涉及修改甚至重新定義業(yè)務(wù)邏輯,所以同樣面臨巨大挑戰(zhàn)。
假設(shè)我們要修改的是一個(gè)網(wǎng)購系統(tǒng),那么用戶購物下訂單的流程應(yīng)該會(huì)涉及用戶、訂單、支付等一系列的模塊。
1)如果我們要修改用戶模塊,那么我們需要用代碼判斷過來的請(qǐng)求是應(yīng)該走測(cè)試邏輯還是生產(chǎn)邏輯。比較常見的方法是預(yù)先指定一個(gè)用戶ID的范圍,如果是這個(gè)范圍的用戶,就走測(cè)試邏輯,否則走生產(chǎn)邏輯。
2)用戶模塊之后,邏輯走到了訂單模塊,這時(shí),我們可能仍然希望通過用戶ID來判斷是否應(yīng)該走測(cè)試邏輯,但實(shí)際情況卻可能是:經(jīng)過一系列的復(fù)雜處理流程,訂單模塊根本看不到用戶信息,所以此路不通。
3)為了讓訂單模塊能區(qū)分出正常訂單和測(cè)試訂單,就必須在用戶模塊增加一些處理邏輯,比如給訂單號(hào)加上特殊標(biāo)記等。但是,在一個(gè)復(fù)雜的系統(tǒng)里,用戶模塊并不容易知道后續(xù)流程要經(jīng)過的所有模塊,所以,為了不影響正常的生產(chǎn)邏輯,僅僅保證測(cè)試狀態(tài)的正常傳遞就需要付出不小的努力,更不用說還要考慮是否要訪問不同的數(shù)據(jù)集,是否要模擬第三方服務(wù)等各種情況。
很明顯,這種業(yè)務(wù)邏輯的修改,所需的工作量與功能點(diǎn)數(shù)量成正比。但除了巨大的工作量,更嚴(yán)重的問題是,在辛苦的修改之后,有誰能保證所有需要做的修改都改了,并且改對(duì)了?而萬一有遺漏或錯(cuò)誤,就有可能破壞生產(chǎn)系統(tǒng),這個(gè)風(fēng)險(xiǎn)實(shí)在是太大了,我們很難承受。
3? 解決之道
3.1? 一致性和隔離性
從前面的分析可以看出,傳統(tǒng)的測(cè)試方法或者成本高昂且得不到準(zhǔn)確的數(shù)據(jù),或者工作量巨大且存在破壞生產(chǎn)系統(tǒng)的風(fēng)險(xiǎn)。因此,MegaEase認(rèn)為,要解決網(wǎng)絡(luò)時(shí)代的全站壓力測(cè)試問題,必須使用一種全新的方法,而這種方法的關(guān)鍵在于“三一致”和“四隔離”。
“三一致”是指業(yè)務(wù)一致、數(shù)據(jù)一致和資源一致。也就是說,測(cè)試系統(tǒng)和生產(chǎn)系統(tǒng)應(yīng)該完全相同,只有這樣,才能得到準(zhǔn)確的測(cè)試數(shù)據(jù)。現(xiàn)實(shí)地說,100%的一致并不容易做到,比如,我們通常無法要求第三方配合我們進(jìn)行測(cè)試,所以,只能使用模擬的方法替換掉部分第三方依賴。但我們?nèi)匀恍枰M最大可能保證兩個(gè)系統(tǒng)的一致性。
“四隔離”是指業(yè)務(wù)隔離、數(shù)據(jù)隔離、流量隔離和資源隔離。這些隔離,都是為了將生產(chǎn)系統(tǒng)和測(cè)試系統(tǒng)完全分開,避免它們相互影響。很顯然,三一致解決的是測(cè)試結(jié)果的準(zhǔn)確性問題,而四隔離則保證了測(cè)試過程不會(huì)影響生產(chǎn)系統(tǒng)。
基于上面的定義,我們可以使用一種叫Shadow Service的技術(shù),其主要利用云原生中的SideCar和Service Mesh技術(shù)。通過Shadow Service,我們可以非常容易地為系統(tǒng)中的所有的應(yīng)用服務(wù)創(chuàng)建一個(gè)影子(Shadow)副本,除了帶有Shadow標(biāo)記之外,這些影子副本與原始服務(wù)完全相同,從而保證了業(yè)務(wù)一致和業(yè)務(wù)隔離。同時(shí),Shadow Service還會(huì)自動(dòng)創(chuàng)建一條流量分配規(guī)則,將帶有特殊標(biāo)記的流量,比如,我們?cè)谟糜跍y(cè)試的請(qǐng)求協(xié)議頭中加上一個(gè)標(biāo)志Request-Header: Test,通過Shadow Service的Mesh Ingress組件,將此請(qǐng)求作為測(cè)試請(qǐng)求轉(zhuǎn)發(fā)到服務(wù)副本,將其他沒有該標(biāo)識(shí)的請(qǐng)求發(fā)送給原始服務(wù),以實(shí)現(xiàn)流量隔離。
在數(shù)據(jù)方面,Shadow Service可以根據(jù)配置替換掉包括MySQL、Kafka、Redis等在內(nèi)的多種中間件的連接信息,并借此改變數(shù)據(jù)請(qǐng)求的發(fā)送目標(biāo),這保證了數(shù)據(jù)隔離。而用戶則可以直接將生產(chǎn)數(shù)據(jù)復(fù)制一份作為測(cè)試數(shù)據(jù)來保證數(shù)據(jù)一致。
資源一致和資源隔離是指測(cè)試系統(tǒng)要使用與生產(chǎn)系統(tǒng)規(guī)格相同的資源,但不應(yīng)該共享同一套資源。這主要是一個(gè)硬件問題,但Kubernetes已經(jīng)在軟件層面給出了非常好的答案,而Shadow Service是建立在Kubernetes之上,所以,通過將服務(wù)副本部署到新的Pod中,資源一致和資源隔離就都得到了保證。
3.2? Shadow Service工作方式
下面我們以一個(gè)簡(jiǎn)化后的訂單支付的場(chǎng)景,介紹一下Shadow Service的具體使用方法。這個(gè)場(chǎng)景涉及訂單(Order)和支付(Payment)兩個(gè)服務(wù),訂單服務(wù)會(huì)調(diào)用支付服務(wù),支付服務(wù)最終會(huì)調(diào)用第三方服務(wù)(圖中未畫出)來完成支付,同時(shí),訂單服務(wù)還會(huì)訪問MySQL數(shù)據(jù)庫。整個(gè)系統(tǒng),通過MegaEase的EaseMesh部署在Kubernetes中,部署過程中,EaseMesh會(huì)向應(yīng)用的Pod中注入的SideCar(基于Easegress)和JavaAgent(基于EaseAgent),從而劫持應(yīng)用發(fā)出的HTTP請(qǐng)求和數(shù)據(jù)請(qǐng)求,實(shí)現(xiàn)前面提到的“三一致”和“四隔離”。系統(tǒng)的總體架構(gòu)如圖1所示。
要對(duì)其進(jìn)行測(cè)試,我們需要首先創(chuàng)建數(shù)據(jù)庫的副本。這一步,可以通過數(shù)據(jù)庫的備份恢復(fù)功能來完成,如圖2所示,因?yàn)閿?shù)據(jù)副本和原始數(shù)據(jù)位于同一個(gè)安全域,所以不必對(duì)數(shù)據(jù)進(jìn)行脫敏處理。
然后,使用下面的配置通過EaseMesh的命令創(chuàng)建訂單服務(wù)的shadow副本和灰度規(guī)則。注意,在創(chuàng)建服務(wù)的副本時(shí),我們將其使用的數(shù)據(jù)庫指向了剛剛創(chuàng)建的數(shù)據(jù)庫副本。最終系統(tǒng)架構(gòu)如圖3所示。
kind: ShadowService
apiVersion: mesh.megaease.com/v1alpla1
metadata:
name: shadow-order-service
spec
serviceName: order-service
namespace: megaease-mall
mysql:
uris: "jdbc:mysql://172.20.2.216:3306/shadow_order_db..."
userName: "megaease"
password: "megaease"
最后,因?yàn)椴幌朐跍y(cè)試的時(shí)候?qū)嶋H支付費(fèi)用,我們要用下面的命令Mock支付服務(wù)。注意,調(diào)用第三方支付服務(wù)時(shí)通常會(huì)涉及多個(gè)非常復(fù)雜的安全驗(yàn)證步驟,這導(dǎo)致這個(gè)服務(wù)難以被直接Mock。所以,我們把第三方服務(wù)包裝成了系統(tǒng)內(nèi)部的服務(wù),并借此簡(jiǎn)化了調(diào)用接口,下面Mock的實(shí)際上是這個(gè)包裝后的服務(wù):
kind: Mock
apiVersion: mesh.megaease.com/v1alpha1
metadata:
name: payment-service
registerTenant: megaease-mall
spec:
enabled: false
rules:
- match:
pathPrefix: /
headers:
Request-Header:
exact: Test
code: 200
headers:
Content-Type: application/json
body: '{"result":"succeeded"}'
這樣就完成了整個(gè)測(cè)試系統(tǒng)的創(chuàng)建,我們可以向其發(fā)送帶有Request-Header: Test頭部的請(qǐng)求來進(jìn)行壓力測(cè)試。最終的系統(tǒng)架構(gòu)如圖4所示。
3.3? Shadow Service的優(yōu)勢(shì)
相對(duì)于傳統(tǒng)的測(cè)試方法,使用Shadow Service進(jìn)行壓力測(cè)試在以下5個(gè)方面具有明顯的優(yōu)勢(shì):
1)0代碼修改:全部通過配置完整,不需要修改任何代碼,沒有改出Bug的風(fēng)險(xiǎn)。
2)低成本:在使用云服務(wù)器的情況下,測(cè)試用的硬件資源隨用隨申請(qǐng),用完就釋放,僅需要為實(shí)際使用時(shí)段付費(fèi)。
3)業(yè)務(wù)邏輯與生產(chǎn)環(huán)境基本一致:除少數(shù)被Mock的服務(wù)外,測(cè)試系統(tǒng)與生產(chǎn)系統(tǒng)完全一致,最大程度避免了業(yè)務(wù)邏輯的差異導(dǎo)致的誤差。
4)可以使用生產(chǎn)數(shù)據(jù)進(jìn)行測(cè)試:測(cè)試系統(tǒng)和生產(chǎn)系統(tǒng)的數(shù)據(jù)完全一致,保證了測(cè)試結(jié)果的準(zhǔn)確性。
5)安全:雖然測(cè)試時(shí)使用的是生產(chǎn)數(shù)據(jù),但測(cè)試系統(tǒng)和生產(chǎn)系統(tǒng)處于同一個(gè)安全域,所以沒有增加數(shù)據(jù)泄露風(fēng)險(xiǎn)。
4? 結(jié)? 論
通過Service Mesh以及Shadow Service技術(shù)把生產(chǎn)環(huán)境的應(yīng)用服務(wù)和數(shù)據(jù)復(fù)制出一份用于測(cè)試,并通過流量網(wǎng)關(guān)進(jìn)行測(cè)試流量的調(diào)度,我們可以在極低的成本下,實(shí)現(xiàn)業(yè)務(wù)一致、數(shù)據(jù)一致、資源一致以及業(yè)務(wù)隔離、數(shù)據(jù)隔離、流量隔離和資源隔離,同時(shí),也避免了對(duì)代碼的修改,降低了成本,保證了業(yè)務(wù)邏輯與生產(chǎn)環(huán)境的一致性,并可以使用生產(chǎn)數(shù)據(jù)進(jìn)行測(cè)試,確保了測(cè)試結(jié)果的準(zhǔn)確性和系統(tǒng)安全。因?yàn)橹恍枰诟冻鲆欢ǖ牡统杀驹朴?jì)算基礎(chǔ)硬件資源,Shadow Service成為網(wǎng)絡(luò)時(shí)代全站壓力測(cè)試的理想解決方案。
參考文獻(xiàn):
[1] KOSCHEL A,BERTRAM M,BISCHOF R,et al. A Look at Service Meshes [C]// 2021 12th International Conference on Information, Intelligence, Systems & Applications (IISA).Chania Crete:IEEE,2021:1-8.
[2] WEYUKER E J,VOKOLOS F I. Experience with performance testing of software systems: issues, an approach, and case study [J].IEEE Transactions on Software Engineering,2000,26(12):1147-1156.
[3] MALINA P. Kubernetes Canary Deployment Controllerbc [EB/OL].[2023-03-23].https://dspace.vutbr.cz/bitstream/handle/11012/180400/final-thesis.pdf.
[4] RUDRABHATLA C K. Comparison of zero downtime based deployment techniques in public cloud infrastructure [C]//2020 Fourth International Conference on I-SMAC (IoT in Social, Mobile, Analytics and Cloud) (I-SMAC).Palladam:IEEE,2020:1082-1086.
[5] BINDER W,HULAAS J,MORET P. Advanced Java bytecode instrumentation [C]//Proceedings of the 5th international symposium on Principles and practice of programming in Java.Lisboa Portugal:Association for Computing Machinery,2007:135-144.
作者簡(jiǎn)介:陳皓(1976—),男,漢族,云南昆明人,資深系統(tǒng)架構(gòu)師,本科,主要研究方向:大規(guī)模分布式計(jì)算系統(tǒng)及云原生架構(gòu);張博民(1977—),男,漢族,河北雄縣人,資深系統(tǒng)架構(gòu)師,碩士,主要研究方向:服務(wù)網(wǎng)關(guān)和服務(wù)網(wǎng)絡(luò)。
收稿日期:2023-04-23