使用MQTT-JMeter插件,可以方便地添加MQTT連接、發布、訂閱取樣器,構造組合的應用場景,例如背景連接、多發少收、少發多收,計算消息轉發時延等。
下面介紹一下插件的使用方法。
安裝
從github下載您需要的release版本, 解壓mqtt–xmeter-jar-with-dependencies.jar.zip, 將生成的jar文件放到JMeter安裝主目錄的lib/ext下,重啟JMeter,在取樣器中就可以看到插件成功加載。
【注】推薦在最新的JMeter5.4.1版本中安裝使用本插件。
連接操作取樣器
- Server name or IP: 指向被測MQTT服務器地址。【注】為靈活起見,屬性值都可以引用JMeter的系統或自定義變量。
- Port number: 通常TCP連接的端口時1883, SSL連接則是8883。請參照服務器的具體配置。
- Timeout(s): 連接超時設置,以秒為單位。
- Protocols: 客戶端與服務器通過SSL加密通道連接時,可以選擇單向或者雙向認證(Dual)。雙向認證時,您還需要指定相應的信任秘鑰庫(Trust Key Store), 客戶端證書,以及對應的文件保護密碼(Secret)。這些文件可以通過服務器的證書配置轉化得到。例如,對於EMQ的安裝部署,<emqttd_home>/etc/cert下就存放了自簽證的CA,服務器及客戶端證書,參考下面的命令就可以生成插件所需的.jks, .p12文件,secret自行指定即可。
export PATH=$PATH:<JDK_HOME>/bin keytool -import -alias cacert -keystore emqtt.jks -file cacert.pem -storepass <Your_Secret> -trustcacerts -noprompt keytool -import -alias client -keystore emqtt.jks -file client-cert.pem -storepass <Your_Secret> keytool -import -alias server -keystore emqtt.jks -file cert.pem -storepass <Your_Secret> openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.p12 -password pass:<Your_Secret>
- User authentication: 如果服務器配置了用戶認證,您需要提供相應的用戶名和口令。
- ClientId prefix: 標識客戶端的固定前綴,每個連接(虛擬用戶)再添加一個uuid串,整個作為客戶標識。
- Keep alive(s): 心跳信號發送間隔。例如,300表示客戶端每隔300秒向服務器發出ping請求,以保持連接活躍。
- Connect attempt max: 第一次連接過程中,嘗試重連的最大次數。超過該次數則認為連接失敗。
- Reconnect attempt max: 后繼連接過程中,嘗試重連的最大次數。超過該次數則認為連接失敗。
- Clean session: 設置為0,表示創建一個持久會話,在客戶端斷開連接時,會話仍然保持並保存離線消息,直到會話超時注銷。
設置為1,表示創建一個新的臨時會話,在客戶端斷開時,會話自動銷毀。
發布操作取樣器
發布(Pub)取樣器的連接相關屬性與連接取樣器完全相同,下面只介紹Pub特有的屬性。
- Pub options: 服務質量,取值為0,1,2,分別代表MQTT協議規范里的至多一次(AT_MOST_ONCE),至少一次(AT_LEAST_ONCE),精確一次(EXACTLY_ONCE)
- Topic name: 發布消息所屬的話題 (訂閱方可以根據話題不同選擇訂閱)
- Add timestamp in payload:如果勾選,發布的消息體開頭會附帶當前時間戳,利用它可以在消息接收端計算消息達到的延時。不勾選則只發送實際的消息體。
- Retained message: 該值為TRUE表示保留消息,保留的消息會駐留在消息服務器,后來的訂閱者訂閱主題時仍可以接收該消息;該值為false表示不保留消息,當payload為空且該值是true, 則會刪除這條持久化的消息,如果當payload為空且該值是false,則不會刪除這條持久化的消息。
- Payloads: 目前支持三種消息類
- String: 普通字符串 (如上面截圖所示)
- Hex String: 以16進制數值表示的串,比如字符串Hello, 可以表示為48656C6C6F (其中,48在ascii表中對應字母H,依次類推)。通常16進制串用來構造非文本的消息體,例如描述某些私有的協議交互和控制信息等等。
- Random string with fixed length: 按指定長度生成隨機的串作為消息體。
訂閱操作取樣器
- Sub options: 服務質量,含義與發布操作取樣器相同。
- Topic name: 訂閱消息所屬的話題。
- Payload includes timestamp: 如果勾選,會從消息體開頭處解析發送時間戳,用於計算消息的接收延時。
- Debug response: 如果勾選,消息內容會打印在JMeter的響應結果中,用於調試目的。正式運行測試建議不勾選。
-
Sample on:采樣方式,它控制如何采樣。默認值為“elapsed with specified time(ms)”,這意味着子采樣器將每指定毫秒發生一次(默認值為1000ms)。在1000 ms期間,可以接收多條消息,結果生成報告是1000 ms期間的摘要數據。如果該值設置為2000,則表示2000 ms期間的摘要報告。另一個選項是“number of received messages”,這意味着子采樣器將在接收到這些指定數量的消息后發生(默認值為1)。
斷開連接操作取樣器
這個采樣器非常簡單,它只是清除先前創建的連接。因此,下次運行Connect sampler時,它將為您啟動一個新的MQTT服務器連接。如果此時未檢測到連接,則斷開采樣將立即失敗。
混合負載的測試場景
運用以上3種MQTT取樣器,結合JMeter靈活的測試控制,您可以制定各種類型的測試場景。下面我們舉一個例子,構造一個混合負載的場景。mq客戶端只連接一次,定時發布主題,以訂閱到主題消息為一次測試用例結束。
我們定義3個虛擬用戶,分別進行連接,發布,訂閱操作。
- 連接者:添加一個僅一次控制器,模擬單個設備行為,僅一次連接
- 發布者:添加一個定時器,每隔3秒發送一條主題,帶時間戳
- 訂閱者:采樣方式,接收到指定主題消息后發生
在JMeter中運行該場景,4秒鍾左右運行結束。可以在測試結果樹中看到每個操作的詳細信息。表格視圖的”Sample Time”列出了操作花費的時間(毫秒)。由於這次測試在本地,並發用戶數很少,所以連接、消息發送、接收時延都很短。您可以指向實際的MQTT服務器,模擬更大的並發用戶數。