自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

怎樣設計全鏈路壓力測試平臺?

開發(fā) 項目管理
為了實施壓力測試,系統(tǒng)入口流量的復制是一項基礎工作。這些流量數據,在經過清洗(如過濾無效請求)后,可存儲于NoSQL數據庫或云存儲服務中,形成所謂的流量數據工廠。

在行業(yè)中,"壓力測試"(簡稱"壓測")是一個常聽到的術語。你可能在項目開發(fā)過程中親自進行過壓力測試,因此對你來說這不是個新概念。想象一下你進行壓力測試的方式,是否與許多人相同:首先建立一個與生產環(huán)境功能匹配的測試環(huán)境,并導入或生成一系列測試數據。接著,在另一臺服務器上啟動多個線程,以并發(fā)方式調用待測試的接口(接口參數通常設置為相同的,例如,在測試獲取商品信息的接口時,可能會使用相同的商品ID進行壓測)。最終,通過分析訪問日志或檢查測試環(huán)境的監(jiān)控系統(tǒng),記錄壓測期間的QPS(每秒查詢率),然后報告測試結果。這個過程的描述,雖然換了一種說法,但意義基本相同。

使用線上數據和環(huán)境:進行壓力測試時,最佳做法是直接使用實際的線上數據和環(huán)境。這是因為自行搭建的測試環(huán)境可能與生產環(huán)境存在差異,這些差異可能會影響到壓力測試的準確性。

采用線上流量而非模擬請求:為了確保測試結果的有效性,應該使用真實的線上流量進行壓力測試,而不是依賴于模擬請求。這可以通過流量復制技術實現(xiàn),將實際的線上流量復制到測試環(huán)境中。這樣做的原因是,模擬流量可能無法準確反映線上流量的真實行為模式,尤其是在訪問模型和緩存命中率等方面,可能與實際情況大相徑庭。

分散流量源,避免單點壓力:不應該只從一臺服務器發(fā)起所有測試流量,因為這樣很容易觸達單臺服務器的性能瓶頸,從而影響整體的壓力測試結果。為了更準確地模擬用戶的真實請求,應該將產生流量的機器分布在地理位置上靠近最終用戶的地點,比如CDN節(jié)點。如果條件不允許,至少也應該在不同的數據中心或機房內分布流量生成點,以增強測試結果的真實性和可靠性。

錯誤之處主要有以下幾點:

壓力測試是在高并發(fā)大流量條件下對系統(tǒng)進行的測試,旨在觀察系統(tǒng)在峰值負荷下的表現(xiàn),以發(fā)現(xiàn)性能隱患。這是發(fā)現(xiàn)系統(tǒng)問題和確保系統(tǒng)穩(wěn)定性與可用性的關鍵方法。以下是對上述描述的簡化和標號概述:

定義與目的:壓力測試是在極端負載條件下進行的測試,用于觀察和評估系統(tǒng)在面臨高并發(fā)和大流量時的性能。這種測試幫助識別潛在的性能瓶頸,是維持系統(tǒng)穩(wěn)定性和可用性的重要工具。

全鏈路壓測的必要性:不應僅對系統(tǒng)的某個核心模塊進行壓力測試,而需要將接入層、后端服務、數據庫、緩存、消息隊列、中間件以及依賴的第三方服務和資源全面納入測試范圍。這種全方位的測試,也稱為全鏈路壓測,是因為系統(tǒng)的任何部分在用戶訪問量激增時都可能成為性能瓶頸。

周期性測試與自動化平臺的建設:隨著互聯(lián)網項目功能的快速迭代和系統(tǒng)復雜性的增加,定期進行壓力測試變得尤為重要。全鏈路壓測通常需要跨團隊合作,包括DBA、運維團隊和依賴服務方等,帶來較高的人力和協(xié)調成本。為減少這些成本和潛在的線上風險,建立一套自動化的全鏈路壓測平臺是解決方案之一。

搭建全鏈路壓測平臺,主要有兩個關鍵點。

一點是流量的隔離。由于壓力測試是在正式環(huán)境進行,所以需要區(qū)分壓力測試流量和正式流量,這樣可以針對壓力測試的流量做單獨的處理。

另一點是風險的控制。也就是盡量避免壓力測試對于正常訪問用戶的影響。因此,一般來說全鏈路壓測平臺需要包含以下幾個模塊:流量構造和產生模塊;壓測數據隔離模塊;系統(tǒng)健康度檢查和壓測流量干預模塊:

整體壓測平臺的架構圖可以是下面這樣的:

圖片


壓測數據的產生

為了實施壓力測試,系統(tǒng)入口流量的復制是一項基礎工作。這些流量數據,在經過清洗(如過濾無效請求)后,可存儲于NoSQL數據庫或云存儲服務中,形成所謂的流量數據工廠。當進行壓測時,可從此工廠獲取數據,并將其分配至多個壓測節(jié)點。在這一過程中,有幾個關鍵點需要特別注意:

流量復制的方法:可以直接復制負載均衡服務器的訪問日志到流量數據工廠,盡管這種方法在壓測時增加了解析日志的成本。另一種推薦方法是使用開源工具,如GoReplay,來拷貝特定端口的流量,并將其保存至流量數據工廠,同時支持壓測時的流量回放。

壓測流量的分發(fā):為確保壓測的真實性,下發(fā)壓測流量的節(jié)點應盡量接近用戶地理位置,而不是和服務部署節(jié)點位于同一機房。

流量染色:為了區(qū)分壓測流量和實際用戶流量,在HTTP請求頭中增加壓測標記,如is stress test,這樣在流量復制后,可以批量標記請求,確保壓測的準確執(zhí)行和監(jiān)控。

數據如何隔離

在進行壓力測試時,除了復制流量以模擬真實的用戶請求外,還需要對系統(tǒng)進行改造,以實現(xiàn)壓測流量與正式流量的隔離。這樣的隔離可以最大限度減少壓力測試對線上系統(tǒng)的影響。具體而言,需要從兩個方面進行工作:

對下行流量的處理:對于讀取數據的請求(通常稱為下行流量),某些服務或組件不適合進行壓測。例如,在記錄用戶行為數據時,壓測可能會導致大量的假數據生成,如商品瀏覽量的人為膨脹,這會影響到業(yè)務報表,進而影響產品或業(yè)務決策。為避免這種情況,需要對壓測產生的數據進行特殊處理,比如不將這些數據記錄到大數據日志中。

另外,考慮到系統(tǒng)可能依賴于推薦服務來展示用戶可能感興趣的商品,而這些服務通常不會重復推薦已展示的商品。如果壓測流量通過這些推薦服務,可能會導致大量商品被“消耗”,影響線上用戶的推薦效果。因此,需要對這部分服務進行Mock處理,即讓帶有壓測標記的請求經過Mock服務,而非真實的推薦服務。

Mock服務的部署:在搭建Mock服務時,應注意將這些服務部署在與真實服務相同的機房內。這樣做的目的是為了盡可能地模擬真實的服務部署結構,從而提高壓測結果的真實性。部署在相同機房內的Mock服務可以更準確地反映出服務間的調用延遲和處理能力,確保壓測結果的可靠性。

對于寫入數據的請求(通常稱作上行流量),實現(xiàn)壓測流量與正式流量隔離的一個重要策略是使用影子庫。影子庫是一個與線上數據存儲完全隔離的存儲系統(tǒng),用于存儲壓測期間產生的所有寫入數據。這種隔離確保了壓測不會影響到真實的生產數據,同時允許我們在一個盡可能接近真實環(huán)境的設置中測試寫入操作的性能。具體到不同的存儲類型,影子庫的實現(xiàn)方式也有所不同:

MySQL影子庫:對于存儲在MySQL中的數據,可以在同一個MySQL實例中創(chuàng)建一個不同的Schema,其中包含一套與線上相同的庫表結構。同時,為了模擬真實的數據環(huán)境,還需要將線上數據導入到這個影子庫中。這樣做可以確保壓測環(huán)境在數據結構和數據量上都盡可能接近真實環(huán)境,從而提高測試的準確性和可靠性。

Redis影子庫:對于存儲在Redis中的數據,可以通過為壓測流量產生的數據增加一個統(tǒng)一的前綴,并存儲在同一份Redis實例中。這種方法通過命名空間的隔離來區(qū)分正式數據和壓測數據,既保持了數據隔離,又避免了搭建完全獨立的存儲系統(tǒng)的復雜性和成本。

Elasticsearch影子庫:針對存儲在Elasticsearch中的數據,可以選擇將壓測數據放在一個單獨的索引中。這樣的做法便于管理和隔離壓測數據,同時也方便在壓測結束后對這部分數據進行清理或分析。

壓力測試如何實施

在完成線上流量復制和線上系統(tǒng)改造后,便可以開始實施壓力測試。通常,壓力測試前會設定一個目標,例如要求系統(tǒng)整體QPS達到每秒20萬次。但是,在測試中不會突然將請求量提升至每秒20萬次,而是會逐步增加,例如每次增加一萬QPS,然后讓系統(tǒng)穩(wěn)定運行一段時間以觀察其性能表現(xiàn)。如果檢測到任何服務或組件成為性能瓶頸,就會減少壓測流量至上一次的QPS水平以維護服務穩(wěn)定,并對相關服務或組件進行擴容處理后再次增加流量進行測試。

為了降低壓力測試過程中的人力成本,開發(fā)流量監(jiān)控組件是一個有效策略。該組件可以預設性能閾值,例如設定容器CPU使用率的閾值為60%-70%,系統(tǒng)平均響應時間不超過1秒,慢請求比例不超過1%等。一旦系統(tǒng)性能觸及這些閾值,流量監(jiān)控組件便能及時發(fā)現(xiàn)并通知減少壓測流量,同時向開發(fā)和運維團隊發(fā)出報警。這樣,團隊便能快速識別并解決性能瓶頸問題,完成必要的擴容后繼續(xù)進行壓力測試。

在全鏈路壓測平臺的探索方面,眾多大型互聯(lián)網公司如阿里、京東、美團和微博等都已經開發(fā)出適合自己業(yè)務需求的平臺。這些平臺雖然各有特點,但基本遵循相同的原則,包括流量復制、流量隔離、壓力測試、監(jiān)控和熔斷等關鍵步驟,體現(xiàn)了全鏈路壓測的核心理念。因此,在自研適合自己項目的全鏈路壓測平臺時,遵循這些已被驗證的方法論是一個明智的選擇。

責任編輯:武曉燕 來源: 二進制跳動
相關推薦

2022-01-04 17:08:02

全鏈路觀測平臺

2023-01-30 22:34:44

Node.js前端

2023-02-08 19:37:37

大數據技術

2024-09-19 14:02:16

2024-01-05 00:29:36

全鏈路灰度發(fā)布云原生

2018-07-12 09:59:39

microServicmockautoTest

2023-10-16 23:43:52

云原生可觀測性

2023-11-13 10:41:44

Spring微服務

2023-07-07 07:27:14

全鏈路虎牙APM

2022-04-27 10:53:34

web優(yōu)化性能

2023-11-14 09:04:15

用戶節(jié)點不可用

2022-07-22 07:59:17

日志方案

2024-12-16 13:34:35

2025-03-04 08:53:10

2023-10-30 07:25:37

數據湖數據處理

2018-07-03 15:56:59

騰訊

2024-10-23 12:50:13

數據飛輪數字化

2022-08-31 22:25:53

微服務架構DevOPs

2022-09-28 11:33:38

架構
點贊
收藏

51CTO技術棧公眾號