Grafana k6とxk6によるプロダクトリリース前の負荷試験
株式会社enechain / shota3506
メンバー / バックエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
利用プラン | 利用機能 | ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
---|---|---|---|---|
Open Source | パフォーマンステスト機能 | 10名以下 | 2024年8月 | B to B |
利用プラン | Open Source |
---|---|
利用機能 | パフォーマンステスト機能 |
ツールの利用規模 | 10名以下 |
ツールの利用開始時期 | 2024年8月 |
事業形態 | B to B |
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
2024年10月にローンチしたeSquare Liveは、電力卸取引のオンラインマーケットプレイスです。 リアルタイム電力取引というサービスの特性上、一定水準以上のパフォーマンスが要件として求められますが、約9ヶ月間の開発期間のほとんどを機能開発に費やしていたため、リリース約2か月前の段階でどの程度のパフォーマンスがでているのかが不透明でした。
どのような状態を目指していたか
性能の把握ができていない状態だったので、まずは最初の負荷試験を実施し、システムのレイテンシやスループットなどの性能を把握することを目指しました。 試験の結果から負荷がかかった時の性能のボトルネックを特定し、あらかじめ目標として設定した性能が出るようにパフォーマンス改善とインフラのチューニングを実施することをリリースまでの最終的なゴールとしていました。
比較検討したサービス
- Locust
- Gatling
- Apache JMeter
- Apache Bench
比較した軸
導入が簡単であること
リリース前の短期間でパフォーマンス計測とその改善を実施する必要があり、導入が簡単でスムーズに性能改善のイテレーションを回すことができるツールを採用しようと考えていました。 JavaScriptでシンプルにテストシナリオを記述・管理でき、またCLIで手元の環境ですぐに実行して結果の確認ができた点がよかったです。
gRPC Webに対応していること
これはやや特殊な要件で、gRPC WebのAPIに対してリクエストを投げられることです。
取引の主要な機能を提供するAPIサーバーはgRPCのリクエストのみを受け付けており、これにWebブラウザからアクセスできるようにするため、Envoyをリバースプロキシとして立ててgRPC Webのリクエストを受け付ける構成をとっています。
gRPC WebはブラウザからHTTP/1.1でgRPCサーバーへアクセスできるようにすることを目的に作られたプロトコルです。
gRPCを使うのと同じようなインターフェースで利用することができますが、使える機能やメッセージフレーミングなどgRPC over HTTP/2との間には細かい差分があります。
Webブラウザからのアクセスを想定した試験を行うために、gRPC Webをサポートしたツールを使いたいと考え負荷試験ツールを調査してみましたが、自分が調べた範囲ではこのプロトコルをネイティブでサポートしているツールは見つけることができませんでした。
選定理由
k6が、xk6という拡張機能を作成する方法を公式に提供していることが採用の決め手になりました。
xk6はk6のカスタムバイナリを生成するツールで、これを活用することで、シナリオを記述するJavaScriptから呼び出すことのできるモジュールを追加できます。
k6本体と同様に拡張機能自体はGoで実装することになります。
コミュニティによってすでに実装されている拡張機能の中にgRPC Webをサポートするものはありませんでしたが、幸い自分が所属するチームが主に使っていた言語がGoであったため、自分たちで実装する判断をすることができました。
作成した拡張機能がgithub.com/shota3506/xk6-grpc-webになります。
導入の成果
改善したかった課題はどれくらい解決されたか
システムのパフォーマンスの把握と性能改善を完了し、リリース後の安定稼働に繋げることができました。
どのような成果が得られたか
gRPC WebのAPIに対して負荷をかけるスクリプトを数日で用意でき、限られた時間のなかでも性能の評価とパフォーマンスボトルネックの解消のイテレーションを回すことができました。 コードの改善とインフラのチューニングを行うことで、試験対象としていた重要なAPIのうちのほぼ全てで大幅な性能改善を達成しました。
導入時の苦労・悩み
k6はドキュメントが充実しているので、簡単なシナリオでテストを実行する分には特に苦労した点はありませんでした。
xk6で独自の拡張機能を作成する場合はGoの実装が必要になりますが、k6の拡張機能はすでにコミュニティによって数多く提供されていて、これらの実装を参考にすることで簡単に作成することができました。
ドキュメントの拡張機能の一覧やGithubのTopicsから、自分の目的に近い拡張機能を探しました。
今回は、既にk6本体に同梱さているgRPCクライアントの実装が非常に参考になりました。
導入に向けた社内への説明
上長・チームへの説明
少人数での利用から開始したことと、金銭的なコストがなかったことから、導入に際して大きな議論にはなりませんでしたが、以下の点は採用に際してポジティブな点として挙がりました。
- 社内のほとんどのエンジニアが読み書きできるJavaScriptでシナリオを管理できる
- 拡張機能を使って特殊な要件の試験を実施できる
- Kubernetesでの分散負荷試験やDatadogへのメトリクス送信などに簡単に対応でき、将来的に規模の大きな負荷試験を運用しようとした場合も、現在自社で採用しているツールと組み合わせて実現することができる
活用方法
よく使う機能
パフォーマンステスト機能
負荷試験のために利用しています。
xk6によるツールの拡張
gRPC Webのリクエストを投げるために活用しました。
ツールの良い点
- シナリオをJavaScriptで簡潔に記述できる
- ドキュメントの充実度
- ツールを拡張するための機能を公式に提供している
- コミュニティが提供している数多くの拡張機能
ツールの課題点
- Goで実装されたJavaScriptエンジンでスクリプトを実行するため、JavaScriptとしてできることに制限がある
- デフォルトのレポーティング機能がやや簡素
ツールを検討されている方へ
簡単に導入することができるので、まずは手元でシナリオを作ってみて自分たちの要件にあった試験ができるかどうか確認してみると良いと思います。
特殊な要件があっても拡張機能で対応可能なので、公式ドキュメントだけでなくサードパーティが提供している拡張なども調べてみることをお勧めします。
今後の展望
今回はリリース前のスポットで実施した負荷試験に関する話を書きましたが、これからはサービスを開発・運用していく中での負荷試験の実施を考えています。 弊社はインフラとしてKubernetes (GKE)、オブザーバビリティツールとしてDatadogを採用しているので、これらを活用した分散負荷試験の実行基盤を整備し、サービスのリリースフローの中に試験を組み込んでいきたいと考えています。
株式会社enechain / shota3506
メンバー / バックエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
よく見られているレビュー
株式会社enechain / shota3506
メンバー / バックエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名