Contents
Kong GatewayとRedisの連携メカニズム
Kong GatewayとRedisの連携は、分散環境での一貫性を確保するために不可欠です。このセクションでは、レート制限におけるRedisの役割や、通信フローとデータ構造の概要について解説します。Redisは、分散環境におけるリクエストカウンティングの中央集約点として機能し、どのノードからアクセスされても同じルールが適用されるようにします。
レート制限におけるRedisの役割
Kong Gatewayは、複数のノードで分散運用されるため、各ノードがローカルでリクエストカウントを保持するだけでは一貫性が保てません。この問題を解決するのがRedisです。
Redisは以下のようにレート制限に深く関わっています:
- 中央集約的なカウンティング:分散環境におけるリクエスト数を正確に管理します。
- リアルタイム判定:各リクエストごとに即時で閾値を超えたかを判定し、制限を適切に行います。
- 高可用性の確保:Redisの信頼性がレート制限全体の安定性に直結するため、冗長化やスケーリングが重要です。
注意点:Redisの性能や信頼性はレート制限の安定性に直接影響するため、高可用性構成や適切なスケーリングが必要です。
プラグインベースのレート制限構成手順
Kong Gateway v2.x以降では、公式プラグインを使用することで簡単にレート制限を設定できます。このセクションでは、Rate Limitingプラグインの有効化手順や、Redis接続設定のベストプラクティスについて説明します。
Rate Limitingプラグインの有効化手順
Rate Limitingプラグインは、Kong Gatewayに事前に導入しておく必要があります。以下に有効化の手順を示します(環境によって異なります)。
- プラグインのインストール:
kong plugins install kong-plugin-rate-limitingコマンドでインストール。 -
設定ファイルの編集:
kong.confに以下の行を追加します。
conf
plugins = bundled, kong-plugin-rate-limiting -
Kong Gatewayの再起動:変更を反映するため、
kong stop && kong startを実行。
補足:v2.x以降では、公式の
kong-plugin-rate-limitingが推奨されています。非公式プラグインはサポート外となる場合があるため注意が必要です。
Redis接続設定のベストプラクティス
Kong GatewayとRedisを連携させる際には、以下のような設定が重要です:
-
ホスト/ポート指定:
kong.confにRedisサーバーのアドレスを設定します。
conf
redis_host = redis.example.com
redis_port = 6379 -
認証情報の設定:Redisがパスワード保護されている場合、以下のように指定します。
conf
redis_password = your_redis_password -
接続タイムアウトの最適化:高トラフィック環境では、
redis_timeoutを1000~5000msの範囲で調整します。
推奨値:Redisとの通信遅延を防ぐため、
redis_timeout=1000~5000msが一般的です。環境に応じて最適な値を設定してください。
サービス/ルート単位での細粒度な流量制限設定
Kong Gatewayでは、サービスやルートレベルに個別に制限値を設定可能です。このセクションでは、具体的なYAMLファイルの記述例を交えながら解説します。
ルートレベルの制限ポリシー構成例
以下は、特定のルート(/api/v1/users)に対して「1分間3回のアクセス許可」を設定する例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
routes: - name: user_route hosts: - example.com paths: - /api/v1/users plugins: - name: rate-limiting config: second: 3 window_size: 60 |
この設定により、example.com/api/v1/usersへのアクセスは1分間に最大3回に制限されます。
複数サービスへの階層型制限設計
複数のサービスに対して異なる制限を適用する場合、以下のような構成が有効です(例: 2つのサービスにそれぞれ5秒間2回の制限)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
services: - name: service_a routes: - name: route_a plugins: - name: rate-limiting config: second: 2 window_size: 5 - name: service_b routes: - name: route_b plugins: - name: rate-limiting config: second: 3 window_size: 10 |
このように、サービス/ルート単位で柔軟な制限を設定できるのがKong Gatewayの強みです。
Redisキャッシュ有効期限の最適化ポイント
Redisのkey expirationポリシーは、レート制限の精度とパフォーマンスに直接影響します。このセクションでは、TTL設定とパフォーマンスのトレードオフや、スロットルタイムアウト時の挙動について解説します。
TTL設定とパフォーマンスのトレードオフ
Redisのkeyに有効期限(TTL)を設定することで、古いカウントデータが自動的に削除されます。しかし、TTL値が長すぎるとキャッシュヒット率が低下し、リクエスト処理が遅延する可能性があります。
| TTL設定 | パフォーマンス影響 | 推奨用途 |
|---|---|---|
| 30秒 | 高いパフォーマンスだが、制限精度が低め | クライアントの頻繁なリクエスト対応 |
| 60秒 | パフォーマンスと精度のバランス良好 | 多くのAPIでの標準設定 |
| 300秒(5分) | キャッシュヒット率は高まるが、処理遅延リスクあり | 常時アクセスが必要な高トラフィックAPI |
対策例:時間単位の制限(分・時間など)とTTL値を統一し、リクエスト数の正確なカウントを保証しましょう。
過負荷時のエラーレスポンス設計
レート制限を超えた際の適切な応答は、ユーザー体験や開発者のトラブルシューティングに大きく影響します。このセクションでは、HTTPステータスコード選定基準とカスタムメッセージの挿入方法を説明します。
HTTPステータスコード選定基準
レート制限超過時の応答には、RFC 7231に基づいた以下のステータスコードが推奨されます:
| ステータスコード | 意味 | 適用例 |
|---|---|---|
| 429 Too Many Requests | 要求が一時的に制限されている | 制限を越えたリクエストに対して返却されるべき |
| 503 Service Unavailable | サービス側の問題でアクセス不能 | レート制限と別にサービス障害がある場合のみ |
429を使用することで、クライアントが原因で制限されていることを明確に伝えられます。
カスタムメッセージの挿入方法
カスタムメッセージを設定することで、開発者やユーザーに対して具体的な対応方法を提示できます:
|
1 2 3 4 5 6 7 |
plugins: - name: rate-limiting config: second: 3 window_size: 60 message: "アクセス頻度が高いため、一時的に制限しています。1分後に再度お試しください。" |
注意:
message:パラメータはKong Gateway v2.xの公式ドキュメントで確認し、必要に応じてcustom_message:などに変更してください。
実環境におけるカスタム設定事例
Kong Gatewayの導入実績は多く、特に大規模なECサイトなどでの活用が見られます。このセクションでは、高トラフィックAPIへの応用例や、複数リージョン展開時の設計工夫を紹介します。
高トラフィックAPIへの応用例
あるECサイトでは、Kong GatewayとRedisの連携により、以下のように導入しました:
- 対象リソース: 商品情報取得API(
/api/v1/products) - 制限設定: 1秒間に200回のアクセスを許可
- Redis構成: マスター-スレーブ構成で高可用性を確保
この設計により、ピーク時に20%以上のリクエストをブロックしながらも、正常なユーザーはストレスなく利用可能にしました。
複数リージョン展開時の設計工夫
複数のリージョンに展開する際には、以下の設計が重要です:
- Redisクラスター構成: リージョンごとに独立したRedisクラスターを用意し、各リージョンでのカウントデータを分離します。
- ゾーン別制限の実装: 地域ごとのアクセス頻度に応じて、異なるレート制限を適用します(例: 日本国内は厳格、海外は緩やか)。
このようにすれば、グローバルな運用もスムーズに行えるようになります。