新聞中心
全鏈路壓測流量模型
現(xiàn)在全鏈路越來越火,各大廠商也紛紛推出了自己的全鏈路壓測測試方案。特別是針對全鏈路壓測流量模型,各家方案都有所不同。最近我看了一些這方面的資料,有一些感悟。分享給大家。
創(chuàng)新互聯(lián)是一家專業(yè)提供恩陽企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站制作、HTML5、小程序制作等業(yè)務(wù)。10年已為恩陽眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進行中。
全鏈路壓測流量模型的梳理呢,這里就先不講了,各家公司自有司情在。因為主要是全鏈路壓測模型的實現(xiàn),其實實現(xiàn)也對應(yīng)了流量模型的梳理結(jié)果。
業(yè)界常用的三種方一種:是基于業(yè)務(wù)模型的實現(xiàn),一種是基于真實流量的錄制回放,最后一種是灰度分流。
這個是一種比較常用的方式。首先要對公司業(yè)務(wù)模型進行梳理,也就是說對公司的業(yè)務(wù)鏈路進行梳理。這里的業(yè)務(wù)鏈路可能會比較復(fù)雜,不是像很多案例中到的了就非常流行暢的一條鏈路,中間很有可能會出現(xiàn)各種各樣的支路。如果圖圖形化展示的話,某一條鏈路應(yīng)該就是一個樹形結(jié)構(gòu)。樹形結(jié)構(gòu)的開始是用戶的入口頁一般就是入口頁面的登陸,或者說是首頁接口。樹形結(jié)構(gòu)的右側(cè)是用戶的出口,這里根據(jù)業(yè)務(wù)模型不同,用戶的出口會非常的多,所以大多數(shù)來時候來講,這就是一個分叉的樹形結(jié)構(gòu)。
要對這樣的流量模型進行實現(xiàn)。是比較困難的。首先要梳理出這樣的業(yè)務(wù)模型,就不太容易,再加上接口的相互調(diào)用啊,數(shù)據(jù)之間的相互依賴又可能是復(fù)雜程度增加一個量級。所以一般的實現(xiàn)方式就是做歸攏。將比較復(fù)雜的樹形結(jié)構(gòu)簡單化,或者干脆將以個業(yè)務(wù)聯(lián)絡(luò)分解成n個列有鏈路。然后分別實現(xiàn)。最終將流量匯聚,就變成了整個業(yè)務(wù)鏈路的流量模型實現(xiàn)。
在業(yè)務(wù)模型實現(xiàn)這個方向,各家都有不同的實現(xiàn)方式啊,基本上就分為工具以及腳本實現(xiàn)。我自己不怎么用工具做過接口的性能測試,全都是使用java和groovy腳本去實現(xiàn)的。首先,我會實現(xiàn)一個基于接口的業(yè)務(wù)測試框架,將每一個接口封裝成一個方法。接口的參數(shù)即是這個方法的參數(shù)。然后將每一個用戶封裝成一個對象。將用戶的各種信息變成這個對象的屬性。然后用戶在請求不同的接口的時候?qū)τ脩舻膶傩赃M行賦值這樣就達到了一個參數(shù)傳遞的目的。然后通過調(diào)用不同的方法,我們就可以實現(xiàn)對不同接口的請求。通過控制參數(shù)或者說接口請求的頻率,我們就可以達到控制當前用戶。在整個業(yè)務(wù)鏈的走向。
基于流量錄制和回放,這個是最容易實現(xiàn)的方式。也是最容易貼近真實情況的方式。哦,我接觸到的主要有一個回放模型,就是用golang語言寫的goreply。go語言的性能是非常好的,用于性能測試足夠滿足用戶的需求。大多數(shù)公司都會選擇在原生引擎的基礎(chǔ)上做一些封裝。然后對對業(yè)務(wù)進行一些兼容,最主要的還是適配流量來源。通常流量的來源是通過日志文件來獲取的,但是我看行業(yè)內(nèi)也有通過一些固定的流量存儲分析引擎去完成。這里的技術(shù)我不是太熟,也就不多分享啦。
我覺得基于流量錄制回放這種模式有一個比較難以解決的問題:流量的不可見性。一般來說,錄制流量會非常大。介于幾十萬上百萬之間。這么規(guī)模大的流量,是很難對他進行可視化的。常遇到的一個問題,就是對于一些請求量非常小的接口。錄制的時候可能會錄丟。還有一種就是錄制流量的時間范圍不會太廣。那么錄制出來的流量文件只能反映錄制時的流量模型,并不能反映其他錄制時間段的流量模型。如果某個服務(wù)的流量是根據(jù)時間變化的。那么就需要對多個時間段都錄制流量,然后進行合并。由于流量的不可見性,所以對流量的模型進行分析,就會顯得比較麻煩。
這是我在某個會議上看到大佬分享的一個方案?;叶却蠹衣牭目赡鼙容^多的是灰度發(fā)布。就是將服務(wù)或者app更新范圍限制在某些一批人,或者說某個地理范圍。這里講的灰度分流,其實核心上差不多,就是將線上的一部分流量轉(zhuǎn)到某些機器上。以實現(xiàn)對這些機器所在服務(wù)的一些壓測。這種方案。基于線上流量完成,所以幾乎不需要測試。投入過多的資源進行開發(fā)實現(xiàn)。這種方案有點兒基于業(yè)務(wù)模型和基于流量錄制取了一個中間態(tài)。既能保證流量的真實有效性。又可以避免開發(fā)測試腳本帶來的負擔。
這種方式對于公司的架構(gòu),主或者說是分流的實現(xiàn)來說,技術(shù)難度是比較高的。因為他用的全都是用戶的真實數(shù)據(jù),所以一旦出現(xiàn)問題的話,這個問題影響范圍不太可控,而且比較嚴重。對于接收灰度分流流量的機器來說,壓測流量完全真實。但是他也無法避免基于流量錄制,回放同樣的問題。就是流量的不可見性以及流量與時間可能存在于一個關(guān)聯(lián)關(guān)系并不是線性的。甚至這一點流量的灰度分流還不如流量的錄制與回放。我想這也是。我身邊接觸到的公司,都沒有采用這種方案的原因吧。
深入理解golang
最近三年,在工作中使用go開發(fā)了不少服務(wù)。深感g(shù)o的便捷,以及它的runtime的復(fù)雜。我覺得需要定期的進行總結(jié),因此決定寫這篇文章,也許更準確的,應(yīng)該叫筆記。
最近終于解決了一個和cgo有關(guān)的問題。這個問題從發(fā)現(xiàn)到解決前后經(jīng)歷了接近4個月,當然,和人手不足也有關(guān)系。而對于我個人而言,這個問題其實歷時2年!這得從頭說起。
在上一家公司的一個項目里,有一個服務(wù)做音視頻數(shù)據(jù)的提取,這個服務(wù)運行在嵌入式設(shè)備TX2上。音視頻提取這一關(guān)鍵功能主要利用nvidia基于gstreamer開發(fā)的插件,這個插件可以發(fā)揮nvidia gpu的硬件解碼功能。當時這個服務(wù)使用go和c混編的方式,問題的癥狀是服務(wù)運行一段時間后,不輸出音視頻數(shù)據(jù)。遺憾的是,由于疫情,項目停止,因此沒有機會繼續(xù)研究這個問題。
時間來到去年底。當前這個項目進行壓力測試,發(fā)現(xiàn)關(guān)鍵的語音處理服務(wù)運行一段時間后,會出現(xiàn)不拉流的情況,因此也沒有后續(xù)的結(jié)果輸出。癥狀和上一個項目非常像。雖然使用的第三方SDK不一樣,但同樣用了go和c混編的方式。一開始,焦點就放在go的運行時上,覺得可能是go和c相互調(diào)用的方式不對。經(jīng)過合理猜測,并用測試進行驗證后,發(fā)現(xiàn)問題還是在第三方拉流的SDK上,它們的回調(diào)函數(shù)必須要快,否則有可能會阻塞它們的回調(diào)線程。當然,在go調(diào)用c的時候,如果耗時比較長,會對go的運行時造成一些副作用;在c回調(diào)go的時候,go的運行時也有可能阻塞c的回調(diào)線程。但go的運行時已經(jīng)比較成熟,因此我覺得它對這個問題的貢獻不大。以上采用了假設(shè)-驗證的方法,主要的原因還是第三方的拉流SDK不開源。在定位問題的過程中,使用了gdb的gcore來生成堆棧;也搭建了灰度環(huán)境來進行壓力測試,以及完善監(jiān)控,這些都是解決方法的一部分。
正是這一問題,促使我更多的了解go的運行時。而我看得越多,越覺得go的運行時是一個龐大的怪物。因此,抱著能了解一點是一點的心態(tài),不斷的完善這篇筆記。
go是什么編程語言?主要應(yīng)用于哪些方面?
Go語言由Google公司開發(fā),并于2009年開源,相比Java/Python/C等語言,Go尤其擅長并發(fā)編程,性能堪比C語言,開發(fā)效率肩比Python,被譽為“21世紀的C語言”。
Go語言在云計算、大數(shù)據(jù)、微服務(wù)、高并發(fā)領(lǐng)域應(yīng)用應(yīng)用非常廣泛。BAT大廠正在把Go作為新項目開發(fā)的首選語言。
Go語言能干什么?
1、服務(wù)端開發(fā):以前你使用C或者C++做的那些事情,用Go來做很合適,例如日志處理、文件系統(tǒng)、監(jiān)控系統(tǒng)等;
2、DevOps:運維生態(tài)中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go語言開發(fā);
3、網(wǎng)絡(luò)編程:大量優(yōu)秀的Web框架如Echo、Gin、Iris、beego等,而且Go內(nèi)置的 net/http包十分的優(yōu)秀;
4、Paas云平臺領(lǐng)域:Kubernetes和Docker Swarm等;
5、分布式存儲領(lǐng)域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、區(qū)塊鏈領(lǐng)域:區(qū)塊鏈里面有兩個明星項目以太坊和fabric都使用Go語言;
7、容器虛擬化:大名鼎鼎的Docker就是使用Go語言實現(xiàn)的;
8、爬蟲及大數(shù)據(jù):Go語言天生支持并發(fā),所以十分適合編寫分布式爬蟲及大數(shù)據(jù)處理。
網(wǎng)站名稱:go語言灰度發(fā)布的簡單介紹
地址分享:http://www.dlmjj.cn/article/hhdosi.html