悪あがきプログラマー

悪あがきを続けていきたい技術と書評なブログです。トレタでiOSエンジニアやってます。

WebSocketの負荷試験をJMeterでやる(kawasima / jmeter-websocket使用)

こちらで公開されているWebSocketサンプラを使います。
WebSocketを負荷テストする: overflow:auto

WebSocketの知識が足りないままやってて色々とハマったのでそのメモになります。

WebSocketの流れ

WebSocketを接続するためには2回のリクエストが必要になります。
f:id:y_koh:20140223103545p:plain

まずhttpでWebSocket接続に使用するセッションIDを取得します。
f:id:y_koh:20140223103548p:plain

Responseの先頭がセッションIDです。
f:id:y_koh:20140223103551p:plain

上記で取得したセッションIDをWebSocketのパスに加えてWebSocketリクエストします。
f:id:y_koh:20140223103556p:plain

JMeterでどう書くの?

こんな感じで特に難しいことはないです。
f:id:y_koh:20140223104619p:plain

タイムスタンプ生成(必須かわからないけどブラウザの挙動をなるべくエミュレートしたくて)。
f:id:y_koh:20140223104625p:plain

セッションIDを取得するためのhttpをリクエスト。
f:id:y_koh:20140223104630p:plain

正規表現でレスポンスからセッションIDを取得して変数に設定。
f:id:y_koh:20140223104633p:plain

セッションIDをパスに追加してWebSocketをリクエスト。
f:id:y_koh:20140223104638p:plain

使用したjmxはGistに上げてます。
WebSocket負荷テスト.jmx

もう一つのハマりどころ

WebSocketサンプラの送信メッセージで何も送らなかったり不正なメッセージを送るとレスポンスが返ってこずタイムアウトになります。。
f:id:y_koh:20140223104638p:plain

ここで送る値はChromeデバッガのこの部分表示される値になります。
f:id:y_koh:20140223110343p:plain

ちなみに頭の「1::」とか「5::」とかはWebSocketのオペレーションコードの様です。送信するメッセージが無い場合は「1::」を指定すればうまくいきました。

以上です。あまり情報が見つからなかったので誰かの助けになれば幸いです。

(追記)
Twitterにて指摘頂きました。1::〜はSocket.IOの仕様でWebSocketとは関係ないとのことです。勘違いしてました。。

リンク先からMessagesの見出しを引用しておきます。詳細はリンク先を参照してください。

(0) Disconnect
(1) Connect
(2) Heartbeat
(3) Message
(4) JSON Message
(5) Event
(6) ACK
(7) Error
(8) Noop

https://github.com/LearnBoost/socket.io-spec#messages