髙妻智一JMeter-WebSocketSamplerを使用したSocket.IOの負荷試験ツイートシェアはてブLINEPocketSocket.IOの負荷試験どうやってますか?今回はSocket.IOサーバーの負荷試験について書きたいと思います。負荷試験でよく使われるツールとしてJMeterがありますが、JMeterはこのままではwebsocketに対応していないのでプラグインを追加する必要があります。追加するプラグインや設定等に関してはmaciejzaleski/JMeter-WebSocketSamplerを参考にしていただければと思います。GitHubに下記で紹介するJMeterのシナリオがあるのでこっちも参考にしてください。ちなみにリアルタイム通信をすぐ始められるOSSです。tomokazukozuma/Real-Time-Server-Side以降、JMeterに導入した前提でWebSocketSamplerの使い方だけ説明したいと思います。手順1socket.ioを起動しているIPを設定し、Pathにsocket.io/?EIO=3&transport=websocketを設定します。Pathに設定しているものはsocket.ioの仕様で決まっており、EIOはengine.io-protocolのバージョン3を使用して、トランスポートにwebsocketを使用するという設定になります。pollingからwebsocketにUpgradeして接続したい場合はtransport=pollingと設定すれば接続できます。samplerからでも同じコネクションを使用することができます。参考画像ではUSER_IDを渡すことで同じユーザーは同じコネクションを使用できるように設定しています。spaceを指定することができます。type、最後の/は接続するnamespaceを表しています。/gvgというnamespaceに接続する場合はここのデータを40/gvgとすれば/gvgに接続することができます。接続が完了するとサーバーから40というメッセージが返ってきます。/は省略できるので40/と同じ意味となります。samplerでの処理を終了することができます。typeの意味)が返ってきたときに接続を閉じることができます。backlogはサーバーから受け取ったデータを何個まで保持するかの設定になります。手順3接続が完了したらサーバー側のイベントを呼ぶことができるようになります。下記画像はroom_joinというイベントに{roomId:1}というデータを送るときの設定です。]内の1番目がイベント名、2番目が送るデータになります。手順4サーバーからデータを受け取る場合は少し工夫が必要になります。HTTPの場合はリクエストとレスポンスが一対一で対応するので一つのサンプラーでリクエストとレスポンスの処理が完了しますが、websocketの場合はそうではないのでデータを送るサンプラーと受け取るサンプラーを別々に分けます。データを送るサンプラーは上記手順の3番になります。データを受け取るときに問題になるのがwebsocketの場合はサーバーの任意のタイミングでデータが送られてくるのでそれまでwebsocketが切断されないようにする必要があります。その設定が下記画像の設定になります。typeという意味になります。このデータでクライアントは定期的にサーバーにハートビートを送り、接続が切られないようにできます。手順5次に手順4のハートビートを繰り返す処理を設定します。controller(room待機中)を追加し、ConditionにisLoopという変数を使用します。controllerを抜けるようにします。ここでisLoopがfalseになるのは他のユーザーがroomに入ってきて人数が一定数に達したら場合を想定しています。Listenerを追加します。Listenerはサーバーから送られてくるデータを受け取ったあとに処理を加えることができるリスナーです。言語設定と実際の処理を記述することができます。画像ではJavascriptで記述し、roomに入った人数が2人を超えたらisLoopがfalseになるような処理を書いています。手順7実際にサーバーから送られてきているデータは下記です。3はハートビートを送った応答としてサーバーから返ってきている値です。36]のようなデータが送られてきます。このデータを上記6のスクリプトで処理するとisLoopの値を変更できます。まとめ以上がJMeter-WebSocketSamplerを使用したSocket.IOへの負荷のかけ方になります。webosocketはhttpと違って負荷のかけ方に工夫が必要になるということが分かったと思いますが、基本的には上記手順の組み合わせでいろんなパターンで負荷をかけることができると思います。自作スクリプトでもいいですが、Node.jsの書き方が分からなくても負荷をかけられるようになるので是非試して見てください。上記JMeterのシナリオをGitHubで公開しているので是非参考にしてみてください。基礎から応用までサンプルコードを使って解説しており、Node.jsが初めての人でも読める技術書となっています。上級者向けにはExpressフレームワークを使った実用的な開発手法の解説もありこれからアプリケーションを開発する人の参考になると思います。現状では書き方が古くなっていますが、Node.jsの初心者から上級者まで学ぶことの多い書籍です。2013年02月AmazonKindle楽天ブックス負荷試験に関する数少ない良書です。やって行うのかのアプローチ方法などAWSに限らずこれから負荷試験を行う方にとって参考になると思います。他の方の書評でも書かれていますが負荷試験についてここまで丁寧にまとまった情報はないので一読してみるのをおすすめします。スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。Incにブロックチェーンエンジニアとして入社。18:03情報ありがとうございました。ちなみMaster-Slave構成で組んだ場合には、下記エラーがでました。disabled)Masterのjmeter.propertiesファイルで「mode=standard」にすると正常にMaster-Slave構成で動作しました。18:52コメントありがとうございます。09:582年近く前の記事ですが参考になったみたいでよかったです!不明点などありましたらコメント欄またはTwitterのDMでもご連絡ください!今後ともよろしくお願いします。コメントをキャンセルメールアドレスが公開されることはありません。*サイトNTTデータとTwitter、Yahoo知恵袋の業務提携にみるソーシャルメディア分析Socket.IOプロトコルの読み方RECOMMENDこちらの記事も人気です。