動機
JMeterやLocust、Gatlingなどの負荷試験ツールで負荷試験を行う際、「このツールのこういう挙動ってどうなってるんだっけ?」というのをちょちょいと検証したいと思う瞬間がよくあります。
そういうときにお誂え向きのサーバなどがあればよいのですが、あれこれ準備せずサクっと容易したいときにはNodeJSでローカルにサーバを立てるのが一番お手軽だと思いやってみました。車輪の再発明上等。
やりたいこと
- getパラメータに応じた遅延時間をシミュレートするWebサーバ
- 任意のURLを拾って最低限のJSONレスポンスを返す
- 処理時間と受けたタイムスタンプぐらいはコンソールで確認できる
環境
- Windows 7
- curlインストール済(動作確認に使用)
やりかた
NodeJSをインストールする
公式サイトからインストーラを落としてただインストールするのが一番シンプルです。将来に渡って使いそうでNodeJSのバージョン管理を気にする場合はNodist等を経由してインストールする方が吉。自分は↓の記事に従って導入しました。
- nodistでNode.jsをバージョン管理 - Qiita
HTTPサーバを書く
モック用のお手軽サーバなので、最低限。
JS初心者なので色々コードが醜いかもしれません。勉強します。
let http = require('http');
let url = require('url');
let querystring = require('querystring');
let myApp = function(request,response){
let timestamp = new Date();
let parsedUrl = url.parse(request.url);
let parsedQuery = querystring.parse(parsedUrl.query);
let res_body={
method : request.method,
path : parsedUrl.pathname,
query : parsedQuery
};
// getパラメータに"delay=xxx"があれば、そのミリ秒だけ遅延させる
let delay = (parsedQuery.delay ) ? parsedQuery.delay : 0;
setTimeout((path,res,ts)=>{
let elapsed = Date.now()- ts.getTime();
res.writeHead(200,{'Content-Type':'text/json'});
res.end(JSON.stringify(res_body)+"\n");
let logStr = `[${ts.toLocaleString()}] "${path}" ${elapsed}`;
console.log(logStr);
},delay,parsedUrl.path,response,timestamp);
};
// ローカルの8081番ポートで起動。環境に応じて変更
http.createServer(myApp).listen(8081,'127.0.0.1');
HTTPサーバを起動
上記app.js
のあるフォルダで以下コマンドを叩きます。
$ node app.js
これだけで準備完了です。http://localhost:8081/
以下の任意のアクセスに応答し、HTTPメソッドとアクセスしたパス、getパラメータのクエリの中身だけJSONで返してくれるシンプルなサーバが出来上がりました。
getパラメータでdelay=xxx
としてミリ秒数を指定することで、その時間だけレスポンスを遅らせることができます。
実行例 : 1多重
とりあえずcurlで叩いてみる。
$ date +%s;curl "http://localhost:8081/hogehoge?fugafuga=pi
yopiyo&delay=3000";date +%s
1543430095
{"method":"GET","path":"/hogehoge","query":{"fugafuga":"piyopiyo","delay":"3000"}}
1543430099
$ node app.js
[2018-11-29 03:34:55] "/hogehoge?fugafuga=piyopiyo&delay=3000" 3000
だいたい3秒遅れのレスポンスを返してくれます。
実行例 : 高多重
curlで雑に10多重。
$ for i in `seq 1 10`; do curl http://localhost:8081/hoge?delay=`expr $RANDOM % 3000` >/dev/null 2>&1 & done
[2018-11-29 03:38:05] "/hoge?delay=179" 179
[2018-11-29 03:38:05] "/hoge?delay=277" 283
[2018-11-29 03:38:05] "/hoge?delay=797" 798
[2018-11-29 03:38:05] "/hoge?delay=1896" 1898
[2018-11-29 03:38:05] "/hoge?delay=1484" 1490
[2018-11-29 03:38:05] "/hoge?delay=1311" 1313
[2018-11-29 03:38:05] "/hoge?delay=1253" 1254
[2018-11-29 03:38:05] "/hoge?delay=1251" 1255
[2018-11-29 03:38:05] "/hoge?delay=2597" 2598
[2018-11-29 03:38:05] "/hoge?delay=2710" 2714
多重でもちゃんと叩けますね。
おわりに
以上、簡単にですがローカルで負荷試験ツールを試す用のモックサーバを構築できました。
でも普通にWireMockの遅延シミュレート機能つかったほうが早い気がしてきました。