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

Apigee Edge の Quota ポリシーを使用すると、一定時間内に API プロキシに送信できるリクエストの数を構成できます。

アンチパターン

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>