以前的博客,有對業內比較出名的幾家互聯網大廠的全鏈路壓測方案進行過整理和總結,傳送門:聊聊全鏈路壓測。html
時隔一年多,因爲性能測試及相關知識的學習實踐,對其有了新的認識,這裏,再次聊聊我對全鏈路測試的理解。。。網絡
目前的現狀多線程
以我如今所在的銀行業務系統來講,目前的現狀大概有這些:業務邏輯太複雜、系統龐大、子系統較多、系統間解耦程度較低、調用鏈路較長、核心系統環環相扣。架構
在這種狀況下,常規的性能測試工做內容,大概以下:併發
①、只能進行獨立系統的壓測工做,致使壓測任務量較大;框架
②、強依賴系統較多,第三方調用面臨種種限制,只能經過mock方式解決;運維
③、沒有較爲獨立的性能測試環境,UAT和PAT測試數據差別較大,沒法給予上線一個較爲準確的容量評估;高併發
④、項目排期沒有預留足夠的性能測試時間,致使須要常常加班甚至通宵;工具
⑤、工程師文件創建較爲薄弱,對系統性能的認知和重視度不足,每每讓人以爲沮喪;性能
上面的幾種狀況,據我瞭解,在大多數公司都存在相似的狀況,這些因素致使面臨着愈來愈高的數據衝擊和愈來愈複雜的業務場景,急需一種手段來保障和提升系統的高性能高可用。
面臨的挑戰
除了上面所說的技術層面的問題,要開展全鏈路壓測,還面臨以下的幾點挑戰:
①、因爲全鏈路壓測涉及的系統及場景較多,所以須要跨團隊溝通、跨系統協調改造,公司體量越大,這一點難度就越大;
②、全鏈路壓測涉及的系統較多,且不一樣的系統架構也有所不一樣,所以須要考慮:機房管理、基礎網絡、DB管理、持久存儲、中間件、應用部署、流量接入、監控與運維保障等多方面;
③、全鏈路壓測的目的是找到系統調用鏈路薄弱環節並優化,這就要求對整個調用鏈路涉及的系統進行進行準確的容量規劃,所以環境和配置,是必須重視的一點;
固然,可能還存在其餘問題,好比性能測試團隊成員的技術水平是否知足要求、管理層的支持力度等方面,畢竟,這是一項很龐大複雜的軟件工程項目!!!
不過全鏈路壓測的優勢也很明顯,好比:優化聯絡薄弱環節能夠提升系統的可用性,容量規劃能夠節省成本,提升效率。
開展前的準備工做
在開展全鏈路壓測以前,咱們須要作哪些準備工做?
①、業務梳理:覆蓋所有的業務場景,是難度很大且不理智的選擇,通常來講只須要篩選出高頻使用的功能、核心功能以及基礎功能便可;
②、場景梳理:場景梳理也是很重要的一項工做,由於只有肯定了被測場景,咱們才能設計合理的測試方案和策略,場景覆蓋正常操做、異常操做便可;
③、流量模型:「咱們每每對高併發一無所知!」所以須要經過監控分析等手段,獲得平常流量場景、峯值流量場景下各系統的流量以及配比,進行必定的放大,來做爲全鏈路壓測的流量參考模型;
④、數據處理:全鏈路壓測一般在生產環境進行,因此防止數據污染是必須考慮的問題,通常來講都是經過對入口流量進行標記區分、數據隔離、影子庫等方式來避免,固然,還須要作好災備工做;
⑤、實時監控:不管是壓測開始前仍是測試進行中,都須要及時且可視化的獲取到系統的狀態變化,方便及時排查定位問題,也避免壓測對正常的服務形成干擾;
監控的重點,主要是對應服務的TPS、不一樣百分比的RT、成功率、資源耗用、服務狀態、告警等信息;
全鏈路壓測平臺架構設計
要開展全鏈路壓測,那麼一個合理高效可用的壓測管理平臺,是頗有必要的,參考了不少全鏈路壓測的設計思路,我我的的想法中全鏈路壓測平臺的架構設計,主要由如下幾部分組成:
①、Controller:主要任務爲壓測任務分配、Agent管理;
②、Agent:負責心跳檢測、壓測任務拉取、執行壓測(多進程多線程方式);
③、Task Service:負責壓測任務下發、Agent的橫向擴展,以確保壓測發起端不成爲瓶頸(能夠利用RPC框架來實現);
④、Monitor Service:接收Agent回傳的監控和測試數據日誌,並轉發給消息隊列,讓Compute Service進行彙總計算展示;
⑤、Compute Service:對壓測結果進行計算,並結合Grafana等可視化工具進行界面展現;
⑥、Log Service:日誌服務,即不管壓測機仍是服務應用在測試過程當中產生的日誌,都統一收集,方便進行問題排查定位;
⑦、Elasticsearch/Influxdb:對壓測產生的數據存儲;
⑧、Git:壓測腳本的版本管理;
⑨、Gitlab:做爲數據倉庫進行版本管理,Agent主動拉取腳本執行;
⑩、Redis:主要用於配置信息管理;
PS:固然,我我的的構思存在不完善或者有待仔細斟酌的地方,這裏只是給一個參考。具體的架構設計圖,可參考京東的全鏈路軍演系統ForceBot的架構設計,以下圖:
完成了上面的工做,接下來就能夠開展全鏈路壓測的工做了。固然,有一點須要說明:全鏈路壓測並不適用於中小型公司,一方面由於成本,另外一方面,不適合而已。
最後,在開展性能測試以前,請認真思考,當咱們討論性能測試時,咱們在說什麼?