はじめに
本記事では、Kong Gateway のカスタムプラグインで公式ドキュメントにある言語別の性能を比較します。
本記事で利用したコードは以下になります。
Kong Gateway とは
Kong Gateway とは OSS のクラウドネイティブの API Gateway です。
本記事では深く説明しませんが、 @m5takeda さんの記事で詳しく解説されています。
検証環境
- Ubuntu 24.04.3(WSL)
- Docker
作成するカスタムプラグ
Valkey を利用してルートへのアクセスをカウントする以下のようなプラグインを作成します。
Docker 構成
- Kong: 3.12.0.1
- mem_limit: 2048m
- cpus: 1.0
- Postgres(Kong 用): 17
- mem_limit: 1024m
- cpus: 1.0
- API(Upstream サーバー): python3.12
- mem_limit: 2048m
- cpus: 1.0
- Valkey: 9.0.0
- mem_limit: 4096m
- cpus: 2.0
構成図
性能試験結果
今回は K6 を用いて、アクセスが 100RPS , 300RPS , 500RPS 時の性能を調査します。
K6 設定
{
scenarios: {
constant_request_rate: {
executor: "constant-arrival-rate",
rate: 100,
// rate: 300,
// rate: 500,
timeUnit: "1s",
duration: "60s",
preAllocatedVUs: 300,
// preAllocatedVUs: 500, // 500RPS時
maxVUs: 10000,
// maxVUs: 20000, // 500RPS時
}
}
}
実施結果
- 100RPS
| 送信データ量 |
|---|
| 8.0 kB/s |
| 言語 | avg | med | p(90) | p(95) |
|---|---|---|---|---|
| Lua | 3.54 ms | 3.33 ms | 4.07 ms | 4.42 ms |
| Go | 4.00 ms | 3.67 ms | 4.43 ms | 4.79 ms |
| Python | 4.36 ms | 3.97 ms | 4.74 ms | 5.14 ms |
| JavaScript | 4.30 ms | 3.84 ms | 4.68 ms | 5.12 ms |
- 300RPS
| 送信データ量 |
|---|
| 24 kB/s |
| 言語 | avg | med | p(90) | p(95) |
|---|---|---|---|---|
| Lua | 3.66 ms | 3.19 ms | 3.99 ms | 4.60 ms |
| Go | 3.96 ms | 3.46 ms | 4.37 ms | 5.12 ms |
| Python | 4.48 ms | 3.94 ms | 4.86 ms | 5.66 ms |
| JavaScript | 4.53 ms | 2.74 ms | 5.06 ms | 6.07 ms |
- 500RPS
| 送信データ量 |
|---|
| 41 kB/s |
| 言語 | avg | med | p(90) | p(95) |
|---|---|---|---|---|
| Lua | 6.36 ms | 3.64 ms | 7.14 ms | 13.94 ms |
| Go | 5.08 ms | 3.93 ms | 5.86 ms | 11.36 ms |
| Python | 13.53 ms | 4.95ms | 28.62 ms | 40.17 ms |
| JavaScript | 11.12 ms | 4.56 ms | 17.55 ms | 29.14 ms |
所感
今回の検証結果から、レスポンスタイムに差があれどアクセス数が 300RPS までならどの言語でも使用に問題ないことがわかりました。
ただし 500RPS と高い数値になると Python, JavaScript は選択肢から外し、Lua と Go での実装が適していると判断できます。
ただ今回の検証環境では、Docker で環境を立ち上げている関係上、他のコンテナ資源やホスト OS(WSL)の制約にも影響を受けている可能性があります。
そのため、今回の結果はあくまで 同一マシン上の Docker 環境 という前提になり、本番環境での性能やチューニング次第で逆転する可能性もあります。とはいえ、Lua と Go が高い RPS でも安定した応答を返していたことから、高負荷を想定した API Gateway の拡張には Lua または Go が有力な選択肢になると思います。