EmotionTechテックブログ

株式会社Emotion Techのプロダクト開発部のメンバーが、日々の取り組みや技術的なことを発信していくブログです。

モノリスからマイクロサービスへ k6 導入準備中

Emotion Tech Advent Calendar 2021 20日目

はじめに

 こんにちは、プロダクト開発部部長の吉田です。Advent Calendar20日目を担当させていただきます。前回はマイクロサービス化に向けて段階的に切り替えるための技術を紹介しましたが、今回はマイクロサービスに対する負荷試験ツールを紹介します。マイクロサービス化をしてサービス間でやりとりする場合、どこかのサービスでパフォーマンスが落ちると全体に影響を与える可能性があります。そのため負荷試験が重要になります。Emotion Techは現在Gatlingを利用していますが、新たな負荷ツールとしてk6の導入も検討しております。

k6.io

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ではメインシステムのリプレイスだけではなく、エンジニアの開発環境の見直しを一緒に考えていくメンバーも募集中です。この記事や他の記事を見て弊社に興味をもっていただけましたら、ご応募お待ちしております。

herp.careers

herp.careers

herp.careers

参考