すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ConcurrencyLimitingPolicy を使用してリクエストの同時実行制限を実装する

最終更新日:Jan 13, 2025

ASM トラフィックスケジューリングスイートの ConcurrencyLimitingPolicy 機能を使用して、サービスに送信される同時リクエスト数 (つまり、処理中のリクエスト数) を制限し、サービスの過負荷を回避できます。このポリシーは、処理中のリクエスト数を記録し、数が指定されたしきい値を超えると新しいリクエストを拒否します。このトピックでは、ConcurrencyLimitingPolicy を使用して同時リクエスト数を制限する方法について説明します。

前提条件

手順 1: ConcurrencyLimitingPolicy フィールドを使用して同時実行制限ポリシーを作成する

  1. kubectl を使用して ASM インスタンスに接続します。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。

  2. 次の内容を含む ConcurrencyLimitPolicy.yaml ファイルを作成します。

    apiVersion: istio.alibabacloud.com/v1
    kind: ConcurrencyLimitingPolicy
    metadata:
      name: concurrencylimit
      namespace: istio-system
    spec:
      concurrency_limiter:
        max_concurrency: 1
        parameters:
          max_inflight_duration: 60s
        selectors:
        - service: httpbin.default.svc.cluster.local

    次の表に、いくつかのフィールドについて説明します。詳細については、「ConcurrencyLimitingPolicy フィールドの説明」をご参照ください。

    フィールド

    説明

    max_concurrency

    同時リクエストの最大数。この例では、このフィールドは 1 に設定されています。これは、サービスが一度に 1 つのリクエストのみ処理できることを示します。

    max_inflight_duration

    リクエスト処理のタイムアウト期間。クラスタ内のポッドの再起動などの予期しないイベントが原因で、ASM トラフィックスケジューリングスイートがリクエスト終了イベントの記録に失敗する可能性があります。このようなリクエストが同時実行制限アルゴリズムの判断に影響を与えないようにするために、リクエスト処理のタイムアウト期間を指定する必要があります。このタイムアウト期間の前にリクエストが応答されていない場合、システムはそのようなリクエストが処理されたと見なします。このフィールドは、リクエストの予想される最大応答時間を評価して設定できます。この例では、このフィールドは 60s に設定されています。

    selectors

    同時実行制限ポリシーが適用されるサービス。この例では、サービス httpbin.default.svc.cluster.local が使用されています。これは、同時実行制限ポリシーが httpbin.default.svc.cluster.local サービスに適用されることを示します。

  3. 次のコマンドを実行して、同時実行制限ポリシーを有効にします。

    kubectl apply -f ConcurrencyLimitingPolicy.yaml 

    予想される出力:

    concurrencylimitingpolicy.istio.alibabacloud.com/concurrencylimit created

手順 2: 同時実行制限ポリシーが有効になっていることを確認する

  1. 次のコマンドを実行して、sleep サービスのシェルコマンドラインを開きます。

    kubectl exec -it deploy/sleep -- sh
  2. 次のコマンドを実行して、完了までに 30 秒かかるバックエンドからリクエストを送信し、30 秒以内に 2 番目のリクエストを送信します。

    curl httpbin:8000/delay/30 -I &
    curl httpbin:8000 -I

    予想される出力:

    HTTP/1.1 429 Too Many Requests
    date: Fri, 26 Jul 2024 13:50:55 GMT
    server: envoy
    x-envoy-upstream-service-time: 1
    transfer-encoding: chunked
    
    ~ $ HTTP/1.1 200 OK
    server: envoy
    date: Fri, 26 Jul 2024 13:51:05 GMT
    content-type: application/json
    content-length: 269
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 10006
    
    [1]+  Done                       curl httpbin:8000/delay/30 -I

    出力は、2 番目のリクエストに対して HTTP 429 ステータスコードを含む応答が返されたことを示しています。これは、同時実行制限ポリシーが有効になっていることを証明しています。

参考資料

Grafana で ConcurrencyLimitingPolicy が有効になっているかどうかを確認できます。Grafana の Prometheus インスタンスが ASM トラフィックスケジューリングスイート で構成されていることを確認する必要があります。

次の内容を Grafana にインポートして、ConcurrencyLimitingPolicy のダッシュボードを作成できます。

詳細を表示するにはクリックしてください

{
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": {
          "type": "grafana",
          "uid": "-- Grafana --"
        },
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "fiscalYearStartMonth": 0,
  "graphTooltip": 0,
  "id": 41,
  "links": [],
  "liveNow": false,
  "panels": [
    {
      "datasource": {
        "type": "prometheus",
        "uid": "${datasource}"
      },
      "description": "Signal derived from periodic execution of query: (sum(rate(concurrency_limiter_counter_total{policy_name=\"concurrencylimit\",component_id=\"root.0\",decision_type=\"DECISION_TYPE_ACCEPTED\"}[30s])) / sum(rate(concurrency_limiter_counter_total{policy_name=\"concurrencylimit\",component_id=\"root.0\"}[30s]))) * 100",
      "fieldConfig": { /* 省略 */ },
      /* 省略 */
}

ダッシュボードは次のとおりです。

image