在近日舉行的QCon倫敦大會上,Rachel Reese聲稱,世界天生就是混亂的,我們應(yīng)該有計劃并測試我們的系統(tǒng),確保它能夠處理這種混亂。他描述了Jet這家于2015年7月成立的電子商務(wù)公司是如何使用微服務(wù)和混沌工程的。
Reese強調(diào),測試微服務(wù)在環(huán)境中的交互極其重要,即使所有組件都經(jīng)過了測試,但這并不意味著他們之間的交互是可靠的,也不意味著它們可以一起用于生產(chǎn)環(huán)境,所有這些都必須經(jīng)過測試。她將Jet稱為一家“為正確的工作選擇正確的工具”的公司,對她而言,混沌測試就是其中一個正確的工具。
Reese將微服務(wù)定義為符合單一職責原則(SRP)的應(yīng)用程序,但是在服務(wù)層,由于他們以函數(shù)的方式看待微服務(wù),所以它有一個輸入,并產(chǎn)生一個輸出。她認為,使用微服務(wù)的好處包括簡化擴展性、獨立發(fā)布、均勻分布的復雜性。Jet在10到15個團隊中運行著大約400到1000個微服務(wù),主要是用F#(一種函數(shù)優(yōu)先的編程語言)編寫的。
Reese指出,混沌工程不是為了有趣而破壞代碼,相反,她將其定義為:
在分布式系統(tǒng)上做對照實驗,幫助建立對系統(tǒng)承受不可避免的故障的能力的信心。
參照混沌原則,Reese定義了混沌工程的四個步驟:
定義“正常”(系統(tǒng)的正常狀態(tài)); 假定“正常”會在對照組和實驗組中持續(xù); 引入混沌:服務(wù)器崩潰、硬盤異常、網(wǎng)絡(luò)連接中斷等; 查找對照組和實驗組行為上的差別。更準確地講,這意味著:
建立假設(shè),定義系統(tǒng)的正常行為和狀態(tài),如吞吐量、延遲等; 真實世界的不同事件、流量峰值以及其他可以導致混沌的東西; 在生產(chǎn)環(huán)境中運行實驗,確保測試的真實性; 自動化實驗,讓其連續(xù)運行。Reese發(fā)現(xiàn),混沌工程有許多好處,包括:
白天測試導致系統(tǒng)中斷,就不用在凌晨3點修復問題; 工程師在設(shè)計過程中開始考慮故障; 防止系統(tǒng)后續(xù)出現(xiàn)中斷,讓系統(tǒng)更健康。根據(jù)他們的經(jīng)驗,Reese指出,他們尚還沒有在生產(chǎn)環(huán)境進行測試。作為一家初創(chuàng)企業(yè),他們的主要目標是推出正確的東西。現(xiàn)在,他們白天所有時段都會進行隨機的QA測試。
其中一場對他們而言最“有趣的”的災(zāi)難發(fā)生在數(shù)月之前,他們的手動測試人員發(fā)現(xiàn),他們的搜索引擎宕掉了,導致了下游的一連串問題。這次故障的原因是混沌測試錯誤地重啟了搜索引擎。就靠這么一個故障,他們發(fā)現(xiàn)了五六個不同的問題。
Reese總結(jié)到:
如果可靠性很重要,那么你就應(yīng)該為此開展測試。
Reese的講稿已經(jīng)提供給QCon的參會者,稍后將提供給InfoQ的讀者。
查看英文原文:Chaos Testing of Microservices