アンチパターン: 分散されていない割り当てを構成する

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_mp1quota_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>