Apigee Edge の Quota ポリシーを使用すると、一定時間内に API プロキシに送信できるリクエストの数を構成できます。
アンチパターン
1 つの API プロキシ リクエストは、Message Processor という分散 Edge コンポーネントによって処理されます。API リクエストを処理するために構成された Message Processor が多数存在する場合は、リクエストの割り当てを超過する可能性があります。これは、個々の Message Processor が、自身の処理するリクエストの数をカウントするためです。
例を挙げて説明しましょう。API プロキシに、次のような Quota ポリシーが構成されているとします。
<!-- /antipatterns/examples/1-6.xml --> <Quota name="CheckTrafficQuota"> <Interval>1</Interval> <TimeUnit>hour</TimeUnit> <Allow count="100"/> </Quota>
この構成では、1 時間に合計 100 個のリクエストが許可されます。
しかし実際には、複数の Message Processor が API リクエストを処理する結果、次のような事態となります。
上図について説明します。
- この Quota ポリシーは、1 時間に 100 個のリクエストを許可するように構成されています。
- API プロキシへのリクエストは、2 つの Message Processor によって処理されます。
- 各 Message Processor は、処理中のリクエスト数を追跡する目的で、独自の割り当てカウント変数
quota_count_mp1
とquota_count_mp2
を保持します。 - このため、それぞれの Message Processor が API リクエストを 100 個ずつ許可してしまいます。つまり、実際には 100 個のリクエストではなく、合計 200 個のリクエストが処理されることになります。
影響
このような状況では、割り当ての構成の本来の目的が損なわれ、リクエストを処理するバックエンド サーバーに悪影響が及ぶ可能性があります。
バックエンド サーバーは、次のような影響を受ける可能性があります。
- 想定よりも大きな受信トラフィックにより、大きな負荷がかかる
- 新規の API リクエストに応答できなくなり、503 エラーが発生する
ベスト プラクティス
Quota ポリシーの <Distributed>
要素を true
に設定します。これにより、API リクエスト数の追跡に、すべての Message Processor で共通のカウンタが使用されます。次のコード スニペットは、<Distributed>
要素を設定する例を示します。
<!-- /antipatterns/examples/1-7.xml --> <Quota name="CheckTrafficQuota"> <Interval>1</Interval> <TimeUnit>hour</TimeUnit> <Distributed>true</Distributed> <Allow count="100"/> </Quota>