指南:從 Changelog Highlights 到核心架構(gòu)變遷)
Locust 版本演進技術(shù)指南從 Changelog Highlights 到核心架構(gòu)變遷【免費下載鏈接】locustWrite scalable load tests in plain Python 項目地址: https://gitcode.com/gh_mirrors/lo/locust本篇技術(shù)指南以docs/changelog.rstChangelog Highlights為骨架系統(tǒng)梳理 Locust 從 0.4 到 2.44 各版本的核心變更并結(jié)合當(dāng)前倉庫源碼如 locust/runners.py、locust/argument_parser.py、locust/contrib 等解讀這些變更背后的實現(xiàn)原理。讀完本文你將掌握 Locust 的架構(gòu)演進脈絡(luò)master/worker 調(diào)度模型、事件系統(tǒng)、Web UI 現(xiàn)代化、各類協(xié)議擴展 User理解當(dāng)前版本命令行參數(shù)與配置項的完整語義并能據(jù)此評估升級路徑與遷移風(fēng)險。一、Changelog Highlights 是什么docs/changelog.rst是 Locust 官方文檔中的變更日志精華頁。文檔開篇即說明2.44.2 及之后的版本不再在此文件逐版更新讀者應(yīng)轉(zhuǎn)向 GitHub Releases 頁面與 CHANGELOG.md該文件在本倉庫中持續(xù)維護至 2.46.3。該文檔的價值在于它按版本回溯了 0.4 → 2.44 的關(guān)鍵變更包括破壞性 API 變更、新增 User 類型、分布式模式重構(gòu)、Web UI 演進、事件系統(tǒng)調(diào)整等是理解 Locust 設(shè)計哲學(xué)與升級遷移的第一手資料。下面按主題重組并深度展開。二、分布式架構(gòu)的兩次根本性重構(gòu)2.1 1.0 時代master/slave 術(shù)語體系與序列化安全在 1.0 / 1.0.1 版本中Locust 將Locust/HttpLocust類重命名為User/HttpUser命令行參數(shù)-c/--clients改為-u/--users并將 master/slave 通信序列化從 pickle 切換為 msgpack見docs/changelog.rst0.7 小節(jié)。這一改動直接源于安全考量pickle 反序列化可在持有內(nèi)部端口訪問權(quán)時執(zhí)行遠(yuǎn)程代碼。變更日志明確警告使用舊版本的用戶必須確保 5557/5558 端口不公開暴露且絕不要以 root 身份運行 Locust。當(dāng)前倉庫中l(wèi)ocust/rpc/protocol.py 的Message.serialize()/unserialize()仍延續(xù)這一安全設(shè)計locust/rpc/zmqrpc.py 實現(xiàn)了基于 ZMQ 的 RPC 層。2.2 2.0 時代master 集中調(diào)度模型最重要的一次破壞性變更docs/changelog.rst中 2.0.0 條目明確寫道User ramp up/down 與 User 類型選擇現(xiàn)在由master控制而非 worker 自主決定。這修復(fù)了此前多 worker 場景下 User 類型分布不均衡、ramp up 步進異常、以及測試中 worker 斷連時無法重新分配用戶等問題。與之相關(guān)的破壞性變更包括User 默認(rèn)權(quán)重從 10 改為 1原默認(rèn)值不合理test_start/test_stop事件現(xiàn)在也在 worker 上觸發(fā)此前僅在 master/獨立模式下觸發(fā)worker 連接時上報版本號master 對版本差異發(fā)出警告且拒絕 1.x 的 worker 連接可通過發(fā)送-1繞過版本檢查命令行參數(shù)--slave/--expect-slaves更名為--worker/--expect-workers--no-web更名為--headless。在源碼層面這一模型體現(xiàn)在 locust/dispatch.py 的UsersDispatcher類它實現(xiàn)了new_dispatch()、add_worker()、remove_worker()、_prepare_rebalance()等方法并在__next__()中按迭代向各 worker 下發(fā)用戶增量。而 locust/runners.py 中的MasterRunner第 649 行起持有WorkerNodes集合與rebalancing_enabled()邏輯WorkerRunner第 1224 行起則通過heartbeat()、stats_reporter()、connect_to_master()等與 master 保持通信。從源碼結(jié)構(gòu)看2.0 引入的集中調(diào)度是當(dāng)前--enable-rebalancing實驗特性運行時增刪 worker 自動重分配用戶的基礎(chǔ)。此外locust/argument_parser.py 中仍保留了針對舊參數(shù)的友好報錯例如--expect-slaves會被攔截并提示已更名為 --expect-workers第 675-680 行--slave提示已更名為 --worker第 700-705 行--legacy-ui提示不再支持第 617-624 行。三、User 類與任務(wù)編寫模型的演進3.1 從 Locust/TaskSet 到 User/TaskSet1.0 版本完成了類名體系的重命名同時允許在User類下直接用task聲明任務(wù)此前只能在TaskSet中聲明。2.5 版本明確response.success()/.failure()若在 with 塊外調(diào)用將拋異常2.40 版本進一步讓raise_for_status()考慮failure()/success()的調(diào)用結(jié)果2.40.2 重構(gòu)了 locust/clients.py 中的ResponseContextManager并修復(fù) GC 問題。0.6 版本曾將SubLocust替換為TaskSet并在 1.0 移除task_set屬性、改用tasks屬性。當(dāng)前倉庫中任務(wù)模型集中在 locust/user/task.pytask裝飾器、TaskSet與 locust/user/sequential_taskset.pySequentialTaskSet替代 1.0 中廢棄的TaskSequence/seq_task。3.2 新增的 User 類型從 FastHttpUser 到協(xié)議擴展家族變更日志記錄了大量新增 User 類型每個都能在當(dāng)前倉庫 locust/contrib 目錄中找到對應(yīng)實現(xiàn)版本新增能力倉庫源碼0.12.1FastHttpLocustgeventhttpclient 驅(qū)動官方稱較 HttpLocust 快 5-6 倍locust/contrib/fasthttp.py2.14.0FastHttpUser 增加rest方法便于 REST/JSON API 測試同上2.39.0SocketIOUser2.40.2 重構(gòu)出獨立SocketIOClient類locust/contrib/socketio.py2.39.0MilvusUserlocust/contrib/milvus.py2.41.0MqttUser2.43.4 繞開 paho mqtt 的 340 連接數(shù)限制locust/contrib/mqtt.py2.42.0DNSUserlocust/contrib/dns.py2.43.4Qdrant 支持locust/contrib/qdrant.py2.34.0實驗性O(shè)penAIUser及示例locust/contrib/oai.py2.43.4將響應(yīng)時間分桶提取為可覆寫函數(shù)bucket_response_timelocust/stats.py3.3 任務(wù)調(diào)度與權(quán)重模型2.27.0使用更高效的算法計算用戶分布并支持float 權(quán)重2.25.0修復(fù) UserClass 權(quán)重分布的 gcd 問題2.6.0新增fixed_count允許為某類用戶指定精確數(shù)量而非僅按權(quán)重2.38.0新增 MarkovTaskSet馬爾可夫鏈任務(wù)集。四、事件系統(tǒng)擴展 Locust 的核心機制變更日志中事件系統(tǒng)的演進脈絡(luò)非常清晰0.7事件監(jiān)聽函數(shù)必須接收關(guān)鍵字參數(shù)且推薦附加**kw通配參數(shù)以防未來新增參數(shù)導(dǎo)致崩潰request_success/request_failure的參數(shù)method/path更名為request_type/name1.5.0將request_success/request_failure統(tǒng)一為單個request事件舊事件廢棄但仍可用并新增response對象與context參數(shù)可用于傳遞 username、tags 等2.0.0移除已廢棄的request_success/request_failure處理器2.15.0 正式移除2.4.0request 事件新增start_time與url參數(shù)2.5.0 起 url 改為完整 URL2.8.4新增test_stopping測試停止前觸發(fā)與quit獲取進程退出碼事件2.20.0新增實驗性的EventHook.measure上下文管理器自動計算響應(yīng)時間并自動標(biāo)記失敗2.30.0新增 heartbeat 與 usage monitor 事件2.8.6新增cpu_warning事件監(jiān)聽 CPU 過高時執(zhí)行動作。當(dāng)前實現(xiàn)位于 locust/event.pyEventHook類提供add_listener/remove_listener/fire其中fire(reverseTrue)支持逆序執(zhí)行處理器measure()第 56-89 行用time.perf_counter()計算耗時并以毫秒為單位觸發(fā)request事件。Events類第 102 行起則集中定義了request、user_error等事件及其參數(shù)文檔。1.0 版本還移除了Locust.setup/teardown與TaskSet.setup/teardown鉤子要求改用test_start/test_stop事件from locust import events events.test_start.add_listener def on_test_start(**kw): print(test is starting) events.test_stop.add_listener def on_test_stop(**kw): print(test is stopping)一個更貼近實戰(zhàn)的用法是 2.44.0 新增的逐請求 CSV 日志組件 locust/contrib/csv_request_logger.pyCsvRequestLogger通過監(jiān)聽request事件將每條請求時間戳、請求類型、名稱、響應(yīng)時間毫秒、響應(yīng)長度、狀態(tài)碼、異常逐行寫入 CSV適用于需要單點級數(shù)據(jù)而非聚合統(tǒng)計的后處理場景。其源碼展示了事件監(jiān)聽的推薦姿勢在events.init監(jiān)聽器中調(diào)用logger.register(environment)并在quitting事件中關(guān)閉文件。五、Web UI 的現(xiàn)代化歷程Web UI 是變更日志中篇幅最大的主題之一0.8新增 Web UI 圖表RPS、平均響應(yīng)時間、模擬用戶數(shù)1.0支持--web-authBasic Auth、--tls-cert/--tls-keyHTTPS 服務(wù)——注意當(dāng)前版本中--web-auth已被--web-login取代傳舊參數(shù)會直接報錯見 locust/argument_parser.py2.18.0新增基于 React MaterialUI Vite 的現(xiàn)代 UI當(dāng)時需--modern-ui激活2.22.0現(xiàn)代 UI 成為默認(rèn)移除--modern-ui、新增--legacy-ui后者現(xiàn)已被徹底移除2.31.4發(fā)布 UI NPM 包便于自定義 UI 復(fù)用2.33.0按回車自動在瀏覽器中打開 Web UIHTML 報告文件名支持{u}、{r}、{t}等占位符解析見 locust/argument_parser.py 中--html參數(shù)說明2.37.x 系列host 字段校驗、缺 host 警告、分布式模式下等待 worker 連接后才允許啟動測試、500 請求名時優(yōu)化/stats/requests端點性能2.42.4Web UI 支持多選下拉2.43.4HTML 報告與導(dǎo)航欄統(tǒng)計改用total_rps而非current_rps?,F(xiàn)代 UI 源碼位于 locust/webui/src包括 SwarmForm啟動表單、StatsTable、LogViewer 等組件。2.29.0 起 worker 日志可回傳 master 并在 Log Viewer 標(biāo)簽頁查看這是 locust/runners.py 中WorkerRunner.logs_reporter()與 locust/web.pylogs路由協(xié)作的結(jié)果。六、LoadTestShape 與自定義負(fù)載曲線1.2 版本引入LoadTestShape類當(dāng)時稱為任何自定義負(fù)載形狀并同步支持用戶數(shù)下降ramp down、自定義百分位2.4.1 修復(fù) shape 模式下的統(tǒng)計打印2.12.0 支持 shape 使用自定義 User 類2.17.0 支持抽象 shape 基類并允許 shape 復(fù)用--run-time、--spawn-rate、--users參數(shù)2.18.4 保證兩次tick()調(diào)用之間至少等待一秒2.43.4 修復(fù) shape 測試完成時誤報 --run-time limit reached 的問題。LoadTestShape的當(dāng)前實現(xiàn)位于 locust/shape.py其tick()返回(user_count, spawn_rate)或(user_count, spawn_rate, user_classes)元組返回None表示結(jié)束測試。倉庫 examples/custom_shape 提供了double_wave.py、stages.py、step_load.py等可運行示例。七、命令行參數(shù)與配置體系變遷7.1 新舊參數(shù)對照遷移必讀舊參數(shù)/舊行為新參數(shù)/新行為引入版本--clients/-c--users/-u1.0--hatch-rate--spawn-rate--hatch-rate已廢棄2.32.6 徹底移除1.2 / 2.32.6--no-web--headless1.0--slave/--expect-slaves--worker/--expect-workers1.0--csv-base-name--csv前者僅為別名1.0--num-request/-n早已移除改用--run-time0.6 時代遺留--web-auth--web-login2.21.0--legacy-ui已移除報錯提示2.28.0--no-reset-stats默認(rèn)行為反轉(zhuǎn)--reset-stats0.9--modern-ui已成為默認(rèn)2.22.07.2 環(huán)境變量重命名1.0為避免在 Kubernetes 中與 service/pod 名稱自動注入的環(huán)境變量沖突1.0 做了如下重命名詳見docs/changelog.rst1.0 小節(jié)LOCUST_MASTER→LOCUST_MODE_MASTERLOCUST_SLAVE→LOCUST_MODE_WORKERLOCUST_MASTER_PORT→LOCUST_MASTER_NODE_PORTLOCUST_MASTER_HOST→LOCUST_MASTER_NODE_HOSTCSVFILEBASE→LOCUST_CSV當(dāng)前版本中上述新環(huán)境變量均在 locust/argument_parser.py 中逐一對應(yīng)如LOCUST_MASTER_NODE_HOST對應(yīng)--master-host見第 707-712 行。7.3 配置文件支持2.24.0新增pyproject.toml配置支持此前僅支持.conf1.0新增--config參數(shù)指定配置文件路徑2.42.x修復(fù)單行.conf文件被誤判為 TOML、以及 TOML 解析器被用于.conf文件的問題2.44.x--config-users支持以 JSON 字符串或文件指定用戶配置見 locust/argument_parser.py。配置解析基于 ConfigArgParse2.37.6 起最低 1.7.1因此支持命令行參數(shù)、環(huán)境變量、配置文件三者的統(tǒng)一解析參數(shù)可在 Web UI 中顯示并透傳給 worker。7.4 運行控制與統(tǒng)計輸出類參數(shù)2.19.0新增--processes自動 fork 多個 worker 子進程Windows 不可用見 locust/argument_parser.py2.37.0新增--json-file2.37.1、2.37.10 兩次修復(fù)其回歸將最終統(tǒng)計寫入 JSON 文件--json則輸出到 stdout2.13.0--stop-timeout支持時間字符串如5m30s2.2.0新增--autostart/--autoquit--equal-weights忽略 locustfile 中的權(quán)重均勻分配2.35.0新增--profile用于對 test run 分組展示2.41.0命令行參數(shù)拼寫錯誤時給出 Did you mean ... 建議2.8.0Docker 鏡像瘦身基于 python3-slimx64 壓縮后約 95MB2.8.1 進一步優(yōu)化至約 60MB2.40.0 起 Docker 基礎(chǔ)鏡像升至 Python 3.13Dockerfile位于倉庫根目錄。7.5 標(biāo)簽過濾1.0 版本引入tag裝飾器與--tags/-T、--exclude-tags/-E參數(shù)2.6.0 起這兩個參數(shù)會透傳給 worker。當(dāng)前參數(shù)說明見 locust/argument_parser.py。八、統(tǒng)計、報告與可觀測性8.1 統(tǒng)計系統(tǒng)演進0.7RequestStats重構(gòu)拆分出單條目的StatsEntry0.13響應(yīng)時間統(tǒng)計 CSV 增加 p99.9 與 p99.99統(tǒng)計表末行由 Total 更名為 Aggregated1.4.2新增--html選項保存 HTML 報告2.15.1新增PERCENTILES_TO_CHART參數(shù)配置響應(yīng)時間圖2.30.0UI 總平均響應(yīng)時間替換為 50 分位原 avg 有 bug2.44.0失敗統(tǒng)計新增 first seen / last seen 時間戳。統(tǒng)計核心實現(xiàn)位于 locust/stats.py包括StatsEntry.log()、percentile()、serialize()以及StatsCSV的 CSV 寫出requests/failures/exceptions/history 四類文件。8.2 OpenTelemetry 與日志2.42.4新增 OpenTelemetry 支持2.42.5 增加啟用時日志2.43.4 發(fā)布含 OTEL 依賴的locust-otelDocker 鏡像2.44.1 為 OTEL 增加日志支持并更新 resource。實現(xiàn)位于 locust/opentelemetry.py命令行開關(guān)為--otel環(huán)境變量LOCUST_ENABLE_OPENTELEMETRY見 locust/argument_parser.py倉庫另有 Dockerfile.otel 供參考。九、分布式、進程與平臺支持的時間線0.13.5多 slave 連接問題修復(fù)2.4.2新增--expect-workers-max-waitmaster 等待 worker 連接的超時上限默認(rèn)永久等待追蹤 worker 內(nèi)存使用2.19.0master 消失過久時 worker 自動關(guān)閉2.20.1master/worker 的 ZMQ 連接支持 IPv62.32.0顯式支持 Python 3.13并處理 IPv6 可用性判斷尤其針對 EKS2.41.6正式支持 Python 3.14。Python 版本支持的時間線為0.14 放棄 Python 2 與 3.5 → 2.26.0 放棄 3.8 → 2.34.1 放棄 3.9 → 2.46.1 放棄 3.10見 CHANGELOG.md。十、安全與穩(wěn)定性要點0.7msgpack 替換 pickle 序列化杜絕遠(yuǎn)程代碼執(zhí)行1.3.2修復(fù) Web UI XSS 漏洞官方注明影響有限因為 UI 不應(yīng)對外暴露1.0.2 / 2.37.12檢測并嘗試自動提升RLIMIT_NOFILE打開文件數(shù)上限2.0.0版本不匹配的 worker 將被拒絕連接2.32.5init事件處理器異常視為致命錯誤FastHttpUser 修復(fù) SSL 證書加載性能問題僅加載一次2.43.0 在 requests2.32.5 下重實現(xiàn)2.31.6LocalRunner增加worker_count 1與MasterRunner對齊。十一、升級遷移清單基于變更日志歸納若要從舊版本升級重點核對以下破壞性變更2.0分布式模式下調(diào)度權(quán)已歸 master務(wù)必統(tǒng)一 master 與所有 worker 的版本1.0Locust→User、HttpLocust→HttpUser、--clients→--users、--no-web→--headless環(huán)境變量按 1.0 小節(jié)重命名2.15.0request_success/request_failure處理器已徹底移除統(tǒng)一遷移到request事件2.28.0舊版 UI 已不可用2.32.6--hatch-rate已移除2.34.1Python 3.9/3.10 用戶需先升級 Python事件監(jiān)聽函數(shù)一律使用關(guān)鍵字參數(shù)并帶**kw防止未來事件簽名擴展導(dǎo)致崩潰。結(jié)語docs/changelog.rst濃縮了 Locust 十余年的演進史從單一進程腳本到 master 集中調(diào)度的分布式壓測平臺從requests到 geventhttpclient 的性能路徑從 pickle 到 msgpack 的安全加固從 Flask 模板 UI 到 React 現(xiàn)代 UI以及覆蓋 HTTP、gRPC、MQTT、MongoDB、Milvus、Qdrant、PostgreSQL、Socket.IO、OpenAI、DNS 等協(xié)議的用戶類家族。理解這些變更不僅能幫你安全地完成版本升級更能讓你在閱讀 locust 源碼、編寫自定義擴展事件、User、shape、dispatcher時快速定位設(shè)計意圖。對于 2.44.2 之后的更新請以倉庫根目錄的 CHANGELOG.md 為準(zhǔn)?!久赓M下載鏈接】locustWrite scalable load tests in plain Python 項目地址: https://gitcode.com/gh_mirrors/lo/locust創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考