ConcurrentRateLimit ポリシー

概要

Apigee Edge で実行されている API プロキシからバックエンド サービスへの受信接続を調整します。

使用するレート制限ポリシーがわからない場合は、Quota、Spike Arrest、Concurrent Rate Limit ポリシーの比較をご覧ください。

動画

Concurrent Rate Limit ポリシーを使用してバックエンドとの同時接続を制限する方法については、この動画をご覧ください。

サンプル

    <ConcurrentRatelimit name="ConnectionThrottler" >
       <AllowConnections count="200" ttl="5" />
       <Distributed>true</Distributed>
       <StrictOnTtl>false</StrictOnTtl>
       <TargetIdentifier name="MyTargetEndpoint"  ref="header/qparam/flow variables" />
    </ConcurrentRatelimit>
    

要素リファレンス

この要素リファレンスでは、ConcurrentRatelimit ポリシーの要素と属性について説明します。

    <ConcurrentRatelimit async="false" continueOnError="false" enabled="true" name="Concurrent-Rate-Limit-1">
       <DisplayName>Concurrent Rate Limit 1</DisplayName>
       <AllowConnections count="200" ttl="5"/>
       <Distributed>true</Distributed>
       <StrictOnTtl>false</StrictOnTtl>
       <TargetIdentifier name="default"></TargetIdentifier>
    </ConcurrentRatelimit>
    

<ConcurrentRatelimit> 属性

    <ConcurrentRatelimit async="false" continueOnError="false" enabled="true" name="Concurrent-Rate-Limit-1">
    

次の表に、ポリシーのすべての親要素に共通の属性を記載します。

属性 説明 デフォルト 要否
name

ポリシーの内部名。name 属性の値には、文字、数字、スペース、ハイフン、アンダースコア、ピリオドを使用できます。255 文字を超える値を指定することはできません。

必要に応じて、管理 UI プロキシ エディタで <DisplayName> 要素を使用してポリシーに別のわかりやすい名前でラベルを付けます。

なし 必須
continueOnError

ポリシーが失敗した場合にエラーを返すには、false に設定します。これはほとんどのポリシーで想定される動作です。

ポリシーが失敗してもフロー実行を続行するには、true に設定します。

false 省略可
enabled

ポリシーを適用するには true に設定します。

ポリシーを無効にするには false に設定します。その場合、ポリシーはフローに接続されていているとしても適用されません。

true 省略可
async

この属性は非推奨となりました。

false 非推奨

<DisplayName> 要素

name 属性に加えて、管理 UI プロキシ エディタのポリシーに別のわかりやすい名前でラベルを付けるために使います。

<DisplayName>Policy Display Name</DisplayName>
デフォルト:

なし

この要素を省略した場合、ポリシーの name 属性の値が使用されます

要否: 省略可
型: 文字列

<AllowConnections> 要素

Apigee Edge とバックエンド サービス間で同時に許可する接続数を指定します。

    <AllowConnections count="200" ttl="5"/>
    
デフォルト: なし
必須?: 必須
型: なし

属性

属性 説明 デフォルト 必須?
count Apigee Edge とバックエンド サービス間で同時に許可する接続数を指定します。 なし 必須
ttl

指定した秒数が経過したときにカウンタを自動的に減らす場合に指定します。レスポンスパスで正しく減少されていない接続をクリーンアップする場合に役立ちます。

なし 必須

<Distributed> 要素

Apigee Edge のサーバー インフラストラクチャのインスタンス間でカウンタ値を共有するかどうかを指定します。

    <Distributed>true</Distributed>
    
デフォルト: false
必須?: 省略可
型: Boolean

<StrictOnTtl> 要素

バックエンド サーバーのスループットに関係なく <AllowConnections> ttl 属性の設定を優先する場合は、true に設定します。高スループットまたは低レイテンシのバックエンド サービスでは、このプロパティを true に設定することを検討してください。

    <StrictOnTtl>false</StrictOnTtl>
    
デフォルト: false
必須?: 省略可
型: Boolean

<TargetIdentifier> 要素

調整を適用する TargetEndpoint の名前を指定します。

    <TargetIdentifier name="default"></TargetIdentifier>
    
デフォルト: なし
必須?: 省略可
型: なし

属性

属性 説明 デフォルト 必須?
name 調整を適用する TargetEndpoint の名前を指定します。 なし 省略可
ref なし 省略可

フロー変数

ポリシーを実行するたびに、次の事前定義のフロー変数が読み込まれます。

  • concurrentratelimit.{policy_name}.allowed.count
  • concurrentratelimit.{policy_name}.used.count
  • concurrentratelimit.{policy_name}.available.count
  • concurrentratelimit.{policy_name}.identifier

エラーコード

このセクションでは、このポリシーによってエラーが発生したときに返される障害コードとエラー メッセージ、Edge によって設定される障害変数について説明します。これは、エラーに対処する障害ルールを作成するうえで重要な情報です。詳細については、ポリシーエラーについて知っておくべきこと障害の処理をご覧ください。

ランタイム エラー

ポリシーの実行時に、以下のエラーが発生することがあります。

障害コード HTTP ステータス 発生する状況
policies.concurrentratelimit.ConcurrentRatelimtViolation 503

ConcurrentRatelimit 接続が超過しました。接続制限: {0}

注: スペルミス(「limt」)が含まれていますが、左側に表示されている障害コードは正確です。このエラーをトラップする障害ルールを作成するときは、ここに表示されるコードを正確に使用してください。

デプロイエラー

エラー名 発生する状況
InvalidCountValue ConcurrentRatelimit 無効なカウント値が指定されました。
ConcurrentRatelimitStepAttachment\
NotAllowedAtProxyEndpoint
Concurrent Ratelimit ポリシー {0} の添付は、プロキシのリクエストパス、レスポンスパス、障害パスでは許可されていません。このポリシーは、ターゲット エンドポイントに配置する必要があります。
ConcurrentRatelimitStepAttachment\
MissingAtTargetEndpoint
Concurrent Ratelimit ポリシー {0} の添付は、対象のリクエストパス、レスポンスパス、障害パスでは見つかりません。このポリシーは、Target Request Preflow、Target Response Postflow、DefaultFaultRule に配置する必要があります。
InvalidTTLForMessageTimeOut メッセージのタイムアウトに指定された ConcurrentRatelimit 無効な ttl 値。正の整数でなければなりません。

障害変数

以下の変数は、このポリシーによりエラーが発生したときに設定されます。詳細については、ポリシーエラーについて知っておくべきことをご覧ください。

変数 説明
fault.name="fault_name" fault_name は、上記のランタイム エラー表に記載されている障害の名前です。障害名は、障害コードの最後の部分です。 fault.name Matches "ConcurrentRatelimtViolation"

注: スペルミス(「limt」)が含まれていますが、この例に表示されているエラーコードは、正確です。このエラーをトラップする障害ルールを作成するときは、ここに表示されるコードを正確に使用してください。

concurrentratelimit.policy_name.failed policy_name は、障害をスローしたポリシーの、ユーザーが指定した名前です。 concurrentratelimit.CRL-RateLimitPolicy.failed = true

エラー レスポンスの例

レート制限を超えた場合、ポリシーは HTTP ステータス 503 のみをクライアントに返します。

障害ルールの例

    <faultrule name="VariableOfNonMsgType"></faultrule><FaultRules>
        <FaultRule name="Quota Errors">
            <Step>
                <Name>JavaScript-1</Name>
                <Condition>(fault.name Matches "ConcurrentRatelimtViolation") </Condition>
            </Step>
            <Condition>concurrentratelimit.CRL-RateLimitPolicy.failed=true</Condition>
        </FaultRule>
    </FaultRules>
    

スキーマ

使用上の注意

分散環境では、複製された複数の API プロキシでアプリのトラフィックが管理されている場合があります。それぞれの API プロキシで処理されている接続数が少なくても、一連の API プロキシが複数のデータセンターにまたがる冗長な Message Processor で実行され、すべてが同じバックエンド サービスを参照しているため、全体としてはバックエンド サービスの能力を上回る可能性があります。このポリシーを使用して、このトラフィックの総量を対処できる接続数に制限してください。

Apigee Edge で処理されるリクエスト数がポリシーの接続制限を超えると、Apigee Edge が HTTP レスポンス コード 503(Service Unavailable)を返します。

1 秒あたりのトランザクション数(TPS)が多い API プロキシの場合、このポリシーを使用すると、プロキシのパフォーマンス低下を招くことが確認されています。TPS の高い API プロキシで Concurrent Rate Limit ポリシーを使用してパフォーマンスが著しく低下した場合は、代わりに Spike Arrest ポリシーを試してください。

ポリシーの関連付けに関する詳細

ConcurrentRatelimit ポリシーは、TargetEndpoint の 3 つのフロー(リクエスト、レスポンス、DefaultFaultRule)にステップとして関連付ける必要があります。ポリシーを ProxyEndpoint フローなどの他のフローに関連付けると、デプロイ時に検証エラーが発生します。詳しくは、Apigee コミュニティの投稿をご覧ください。

たとえば、ConnectionThrottler という ConcurrentRatelimit ポリシーを MyTargetEndpoint という TargetEndpoint に関連付けるには、次のような TargetEndpoint 構成を作成します。エラー発生時もレート制限カウンタが正しく維持されるように、DefaultFaultRule にもポリシーを追加する必要があります。

    <TargetEndpoint name="MyTargetEndpoint">
      <DefaultFaultRule name="DefaultFaultRule">
        <Step><Name>ConnectionThrottler</Name></Step>
        <AlwaysEnforce>true</AlwaysEnforce>
      </DefaultFaultRule>
      <PreFlow name="PreFlow">
        <Request>
          <Step><Name>ConnectionThrottler</Name></Step>
        </Request>
      </PreFlow>
      <PostFlow name="PostFlow">
        <Response>
          <Step><Name>ConnectionThrottler</Name></Step>
        </Response>
      </PostFlow>
      <HTTPTargetConnection>
        <URL>http://api.mybackend.service.com</URL>
      </HTTPTargetConnection>
    </TargetEndpoint>
    

関連トピック

Quota ポリシー

Spike Arrest ポリシー

Quota、Spike Arrest、Concurrent Rate Limit ポリシーの比較