Emotion Tech Advent Calendar 2021 20日目
はじめに
こんにちは、プロダクト開発部部長の吉田です。Advent Calendarの20日目を担当させていただきます。前回はマイクロサービス化に向けて段階的に切り替えるための技術を紹介しましたが、今回はマイクロサービスに対する負荷試験ツールを紹介します。マイクロサービス化をしてサービス間でやりとりする場合、どこかのサービスでパフォーマンスが落ちると全体に影響を与える可能性があります。そのため負荷試験が重要になります。Emotion Techは現在Gatlingを利用していますが、新たな負荷ツールとしてk6の導入も検討しております。
k6の特徴
- loadimpact社という負荷試験サービスを提供している会社の負荷試験ツール
- Goで開発されている
- テストコードがJavaScript記述可能
- HTTP/1.1, HTTP/2, WebSocket, gRPCをサポート
- CI関連のサポートがある
- OpenAPI, Postmanからk6 scriptを生成できる URL
- 結果などをNew Relic, Datadog等のモニタリングツールに送信することができる URL
導入方法
公式Docker Imageを使うかmacOSだとbrewでインストールでき、簡単に導入できます。 https://k6.io/docs/getting-started/installation/
今回は、Docker Imageを用います。
Docker Composeを用いた例
簡単な負荷試験を書いてみる
HTTP Status 200が返却されるエンドポイントをk6で呼び出して、レスポンスを確認するコードをJavaScriptで書いて、CLIで実行します。
$ docker-compose run --rm k6 run /src/test_health_check.js
サーバーからのレスポンスは check
で確認することができます。
環境変数を使う方法
続いて、先ほどのコードの接続先を環境変数に置き換えてみます。環境変数は__ENV
で参照できます(参考: [URL])。
Docker Compose側も修正します。
負荷試験対象のRustのウェブサーバーを用意します。
実行結果
Creating test_k6_run ... done /\ |‾‾| /‾‾/ /‾‾/ /\ / \ | |/ / / / / \/ \ | ( / ‾‾\ / \ | |\ \ | (‾) | / __________ \ |__| \__\ \_____/ .io execution: local script: /src/test_health_check2.js output: - scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop): * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s) running (00m01.0s), 0/1 VUs, 1 complete and 0 interrupted iterations default [======================================] 1 VUs 00m01.0s/10m0s 1/1 iters, 1 per VU ✓ status was 200 ✓ body was OK checks.........................: 100.00% ✓ 2 ✗ 0 data_received..................: 77 B 77 B/s data_sent......................: 103 B 102 B/s http_req_blocked...............: avg=3ms min=3ms med=3ms max=3ms p(90)=3ms p(95)=3ms http_req_connecting............: avg=1.12ms min=1.12ms med=1.12ms max=1.12ms p(90)=1.12ms p(95)=1.12ms http_req_duration..............: avg=883.64µs min=883.64µs med=883.64µs max=883.64µs p(90)=883.64µs p(95)=883.64µs { expected_response:true }...: avg=883.64µs min=883.64µs med=883.64µs max=883.64µs p(90)=883.64µs p(95)=883.64µs http_req_failed................: 0.00% ✓ 0 ✗ 1 http_req_receiving.............: avg=96.99µs min=96.99µs med=96.99µs max=96.99µs p(90)=96.99µs p(95)=96.99µs http_req_sending...............: avg=108.45µs min=108.45µs med=108.45µs max=108.45µs p(90)=108.45µs p(95)=108.45µs http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s http_req_waiting...............: avg=678.2µs min=678.2µs med=678.2µs max=678.2µs p(90)=678.2µs p(95)=678.2µs http_reqs......................: 1 0.993074/s iteration_duration.............: avg=1s min=1s med=1s max=1s p(90)=1s p(95)=1s iterations.....................: 1 0.993074/s vus............................: 1 min=1 max=1 vus_max........................: 1 min=1 max=1
シナリオを変更する
k6のオプションを確認すると負荷をかける項目が多く用意されております(参考: URL)。同時接続ユーザ数のオプションはvus
, 負荷テスト実行期間はduration
で指定できます。同時に20ユーザで10秒負荷試験を実施するには以下の通りです。
$ docker-compose run --rm k6 run /src/test_health_check2.js --vus 20 --duration 10s
おわりに
簡単ですが負荷試験ツールk6について紹介させていただきました。現在k6は部分的に活用しております。Emotion Techではメインシステムのリプレイスだけではなく、エンジニアの開発環境の見直しを一緒に考えていくメンバーも募集中です。この記事や他の記事を見て弊社に興味をもっていただけましたら、ご応募お待ちしております。