2024.3.26
SHARE ON |
上次介紹的 Locust 壓力測試,基本上是建立在單個 process 和單個 ip 上。單點測試的確在模擬多個使用者上很方便,但容易受到單一機器的效能影響,模擬幾百幾千可能還可以,但到了幾萬人或是更多,可能就要換另一種方式了。雖然目前我們的軟體可能不需要測試到萬人或更高人數的壓測。但是目前我們軟體設有 Rate Limit 的設計來防止惡意的 DDoS 攻擊,因此如果用之前的單點測試很容易會被判定為黑名單,為了解決這種問題最快的方式當然是直接把要測試的 ip 位置設為白名單。但其實還有另一種方式,就是進行散是測試,不同於一般的壓力測試,分散式壓力測試採用多點式(多個來源 IP),除了可達到單點式的測試結果,可為客戶測試真實情況下,用戶數目上升時會產生的問題,以及是否易於遭受 DDoS 攻擊。
而 Locust 也有提供分散式壓力測試的功能,在分散式壓力測試中,主要有有兩種角色,一個是 master(負責分配)一個是 worker(負責執行壓測),流程是透過 master 來告知底下的 worker 何時生成 user,接著 worker 再將測試到的資聊回傳給 master。(註:master 自身不能產生任何 user)
以下先說明如何設定 process 為 master 或是 worker 指定為 master
locust -f my_locustfile.py --master
指定為 worker 並且將 master 的 ip 告訴 worker
locust -f my_locustfile.py --worker --master-host=192.168.0.14
我們可以使用之前介紹的 event 來自定義要傳送的訊息。
from locust import eventsfrom locust.runners import MasterRunner, WorkerRunner# Fired when the worker receives a message of type 'test_users'def setup_test_users(environment, msg, \*\*kwargs):for user in msg.data:print(f"User {user['name']} received")environment.runner.send_message('acknowledge_users', f"Thanks for the {len(msg.data)} users!")# Fired when the master receives a message of type 'acknowledge_users'def on_acknowledge(msg, \*\*kwargs):print(msg.data)@events.init.add_listenerdef on_locust_init(environment, \*\*\_kwargs):if not isinstance(environment.runner, MasterRunner):environment.runner.register_message('test_users', setup_test_users)if not isinstance(environment.runner, WorkerRunner):environment.runner.register_message('acknowledge_users', on_acknowledge)@events.test_start.add_listenerdef on_test_start(environment, \*\*\_kwargs):if not isinstance(environment.runner, MasterRunner):users = [{"name": "User1"},{"name": "User2"},{"name": "User3"},]environment.runner.send_message('test_users', users)
使用方法就如同上一章所題的一樣,要注意的是,在指定生成的 user 時會平均分配給 worker
Locust
壓力測試