こんにちはバックエンドの須永です。
本記事はAI Shift Advent Calendar 2022の3日目の記事です。
はじめに
この記事では自分が初めてgRPCの負荷テストを実施した経験をまとめました。
AI ShiftではgRPCアプリを部分的に利用しており、今回そのアプリの負荷テストを実施しました。
今回はBidirectional streaming RPCという通信方式のgRPCアプリに対して、ghzという負荷テストツールを利用しています。
負荷テストの注意点とツール紹介
gRPCには4つの通信方式があります。
- Unary RPC
- Server streaming RPC
- Client streaming RPC
- Bidirectional streaming RPC
gRPCアプリの負荷テストを行う上で最初に一番注意すべきことは、
今自分がテストしたいgRPCアプリが4つの通信方式のうち、どの通信方式を採用しているかです。
負荷テストツールの中にはこの4つの中の一部にしか対応していないものがあります。
自分は最初に、JMeterというテストツールを利用していました。
しかし、このJMeterはUnary RPCという通信方式にしか対応していません。
今回はBidirectional streaming RPCを利用していたので、途中で負荷テストツールを切替えました。
通信方式だけでなくツールの言語も違うので自分のプロジェクトにあったツールを選ぶようにしましょう。
gRPCに対応している負荷テストツールはいくつかありますが、
Bidirectional streaming RPCに対応しているのは下記の2つでした。
- Gatling with gRPC plugin(Scala)
- ghz(Go)
AI ShiftではGoを利用しているためghzを採用しました。
ghzの導入と基本的な使い方
ghzはこちらから導入できます。
今回はkubernetesのPodでの利用だったため、Dockerfile内でダウンロードして利用しました。
使い方は3ステップです。
①設定ファイル(config.json)を記入
②設定ファイルを実行
③結果を取得して確認
①設定ファイル(config.json)を記入
どこにリクエストを送りたいのか、どんな内容を送りたいのかなどは次の2つの方法で設定できます。
- JSON or TOMLファイルで定義(詳細)
- ghzコマンドのオプションとして渡す。(後述)
設定できるオプションはこちらです。
2つ同時に利用することもできます。
下記はJSONファイル設定のイメージです。
{
"proto": "/path/to/greeter.proto",
"call": "helloworld.Greeter.SayHello",
"total": 2000,
"concurrency": 50,
"data": {
"name": "Joe"
},
"metadata": {
"foo": "bar",
"trace_id": "{{.RequestNumber}}",
"timestamp": "{{.TimestampUnix}}"
},
"import-paths": [
"/path/to/protos"
],
"max-duration": "10s",
"host": "0.0.0.0:50051"
}
②設定ファイルを実行
①で作成した設定ファイルを-configオプションを使って渡してあげます。他にもオプションをつけることができます。
下記のコマンドによりリクエストが送信されます。
ghz --config=./config.json
③結果を取得して確認
テスト結果の出力先、テスト結果の形式も設定することができます。(CSV,HTMLなど)
一通りテスト結果形式をみたのですが、
主に見やすさの観点からHTMLで出力するといいと思います。
HTMLの例
おわりに
gRPCについてはまだ理解が不十分なところがあり、引き続き勉強していきたいと思いました。
gRPCの知見はまだまだ世の中に出回っていない気がしたので、
さらに情報が出てくるとより使いやすくなるだろうなと思っています。