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

Alibaba Cloud Service Mesh:リクエストヘッダーに基づく LLM トークンレート制限の実装

最終更新日:Dec 02, 2025

Service Mesh (ASM) を使用すると、TCP 属性、HTTP ヘッダー、パス、ホスト、ルート宛先などのリクエスト属性に基づいて、特定のクライアントがリクエストするトークン数を制限できます。このトピックでは、LLM リクエストヘッダーに基づいて、リクエスト中に消費されるトークン数を制限する方法について説明します。トークン制限に達した場合、プロキシはリクエストを外部サービスに転送する代わりにレスポンスを返します。

背景情報

機能概要

ASM の LLM トークンレート制限機能は、WebAssembly (Wasm) プラグインを使用して実装され、レート制限プラグインとレート制限サービスの 2 つのコンポーネントで構成されています。レート制限プラグインはリクエストをインターセプトし、レート制限キーを抽出し、レート制限サービスにクエリを実行して、リクエストにレート制限を適用するかどうかを決定します。LLM のレスポンスフェーズでは、レート制限サービスが再度呼び出され、指定されたキーのレート制限レコードが更新されます。

説明

上の図に示すように、ステップ ⑥ での LLM レスポンスの返却とレート制限レコードの更新は非同期に実行され、互いにブロックしません。

レート制限サービスはクライアントによって維持されます。ASM レート制限プラグインは、標準の HTTP インターフェイスを使用してこのサービスを呼び出します。トークンバケット、リーキーバケット、スライディングウィンドウなど、さまざまなレート制限アルゴリズムを選択して、さまざまなビジネスシナリオに特定のレート制限ルールを実装できます。また、バックエンドサービスの負荷に応じて、レート制限ルールを動的に調整することもできます。さらに、ASM はトークンバケットアルゴリズムを使用するデフォルトのレート制限実装を提供します。この実装は、Redis データベースに依存してレート制限レコードを保存します。

シナリオ

この機能は、次の 2 つのシナリオに適用できます。

  • クライアントが外部の大規模言語モデルサービスを呼び出す:外部の大規模言語モデルサービスは通常、リクエストによって消費されるトークンの数に基づいて課金されます。LLM トークンレート制限を使用すると、クライアントのコストを効果的に管理できます。

  • 推論サービスプロバイダー:外部クライアントがクラスター内の推論サービスを呼び出します。推論サービスには大量のコンピューティングリソースが必要です。LLM トークンレート制限を使用すると、単一の顧客が短期間に過剰なリソースを消費し、他のユーザーのサービスが利用できなくなる事態を防ぐことができます。

前提条件

この例では、ユーザー名が regular-usersubscriber の 2 つのリクエストヘッダーを設定します。Wasm プラグインがリクエストを処理する際、リクエストヘッダーを読み取り、レート制限キーを抽出し、そのキーをレート制限サービスに送信します。その後、レート制限サービスは設定されたレート制限ルールに基づいてリクエストをスロットリングします。これにより、サブスクライバーはより多くのトークンを消費でき、一般ユーザーは少数のトークンしか消費できなくなります。

ステップ1:レート制限サービスのデプロイ

  1. `token-limit.yaml` という名前のファイルを作成し、次の内容を記述します。

    クリックして YAML の内容を表示

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: asm-llm-token-rate-limit-example
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: asm-llm-token-rate-limit-example
      labels:
        app: asm-llm-token-rate-limit-example
        service: asm-llm-token-rate-limit-example
    spec:
      ports:
      - name: http
        port: 80
        targetPort: 8080
      selector:
        app: asm-llm-token-rate-limit-example
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: asm-llm-token-rate-limit-example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: asm-llm-token-rate-limit-example
          version: v1
      template:
        metadata:
          labels:
            app: asm-llm-token-rate-limit-example
            version: v1
          annotations:
            sidecar.istio.io/inject: "true"
        spec:
          tolerations:
          - key: "node.kubernetes.io/disk-pressure"
            operator: "Equal"
            value: ""
            effect: "NoSchedule"
          serviceAccountName: asm-llm-token-rate-limit-example
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-wasm-token-rate-limit-example:v1.23.6.34-g92d6a4b-aliyun
            imagePullPolicy: IfNotPresent
            name: asm-llm-token-rate-limit-example
            ports:
            - containerPort: 8080
            env:
            - name: REDIS_ADDRESS
              value: ${redis-address}:${redis-port}
            - name: REDIS_PASSWORD
              value: "${redis-user}:${password}"
            - name: RATE_LIMIT_CONFIG
              value: |
                [
                  {
                    "rate_limit_key_regex": "regular-user.*",
                    "redis_expired_seconds": 300,
                    "fill_interval_second": 30,
                    "tokens_per_fill": 50,
                    "max_tokens": 200
                  },
                  {
                    "rate_limit_key_regex": "subscriber.*",
                    "redis_expired_seconds": 600,
                    "fill_interval_second": 60,
                    "tokens_per_fill": 100,
                    "max_tokens": 1000
                  }
                ]
            resources:
              limits:
                memory: 256Mi
                cpu: 200m
              requests:
                memory: 64Mi
                cpu: 50m

    上記の YAML ファイルは、RATE_LIMIT_CONFIG 環境変数を設定します。この変数は次のように機能します:

    • rate_limit_key_regex がリクエストヘッダーの regular-user.* に一致する場合、次のレート制限ルールが適用されます:Redis のレコードは 300 秒後に期限切れになります。トークンバケットは 30 秒ごとに 50 トークンが補充されます。トークンバケットの最大容量は 200 トークンです。

    • rate_limit_key_regex がリクエストヘッダーの subscriber.* に一致する場合、次のレート制限ルールが適用されます:Redis のレコードは 600 秒後に期限切れになります。トークンバケットは 60 秒ごとに 100 トークンが補充されます。トークンバケットの最大容量は 1,000 トークンです。

  2. データプレーンクラスターの kubeconfig ファイルを使用して、次のコマンドを実行します。

    kubectl apply -f token-limit.yaml

    ASM はカスタムのレート制限サービスをサポートしており、Redis での完全一致を使用するデフォルトの実装を提供しています。詳細については、コードリポジトリをご参照ください。他のカスタム要件がある場合は、この例に基づいてレート制限サービスを開発できます。

ステップ2:レート制限プラグインのデプロイ

  1. `wasm.yaml` という名前のファイルを作成し、次の内容を記述します。

    apiVersion: extensions.istio.io/v1alpha1
    kind: WasmPlugin
    metadata:
      name: llm-token-ratelimit
      namespace: default
    spec:
      failStrategy: FAIL_OPEN
      imagePullPolicy: IfNotPresent
      selector:
        matchLabels:
          app: sleep
      match:
      - mode: CLIENT
        ports:
        - number: 80
      phase: STATS
      pluginConfig:
        matches:
        - host:
            exact: "dashscope.aliyuncs.com"
        rateLimitKeys:
        - "{{request.headers.user-type}}"
        rateLimitService:
          service: asm-llm-token-rate-limit-example.default.svc.cluster.local
          port: 80
      priority: 10
      url: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-wasm-llm-token-ratelimit:v1.23.6.34-g92d6a4b-aliyun

    次の表に、いくつかの設定項目について説明します。

    設定項目

    説明

    .spec.pluginConfig.matches

    レート制限ロジックを実行するリクエストに一致します。一致しないリクエストは通過が許可されます。

    .spec.pluginConfig.rateLimitKeys

    レート制限キーを生成するためのルールです。詳細については、「属性」をご参照ください。この例では、値は {{request.headers.user-type}} です。

    .spec.pluginConfig.rateLimitService

    レート制限サービスに関する情報です。Service の完全修飾ドメイン名 (FQDN) を指定する必要があります。

  2. コントロールプレーンクラスターの kubeconfig ファイルを使用して、次のコマンドを実行します。

    kubectl apply -f wasm.yaml

ステップ3:機能のテスト

データプレーンクラスターの kubeconfig ファイルを使用して、`regular-user` および `subscriber` として次のコマンドを複数回実行します。

kubectl exec deployment/sleep -it -- curl 'http://dashscope.aliyuncs.com' \
--header 'Content-Type: application/json' \
--header "user-type: regular-user" \
--data '{
    "messages": [
        {"role": "user", "content": "Please introduce yourself"}
    ]
}'
kubectl exec deployment/sleep -it -- curl 'http://dashscope.aliyuncs.com' \
--header 'Content-Type: application/json' \
--header "user-type: subscriber" \
--data '{
    "messages": [
        {"role": "user", "content": "Please introduce yourself"}
    ]
}'

予期される出力:

{"choices":[{"message":{"role":"assistant","content":"I am a large language model from Alibaba Cloud. My name is Tongyi Qianwen. I am a super-large language model that can answer questions, create text, express opinions, and write code. My knowledge comes from text on the Internet. After multiple iterations and optimizations, my capabilities have continuously improved. I can now answer questions on various topics, such as technology, culture, history, and entertainment, and can also engage in continuous conversations. If you have any questions or need help, feel free to let me know, and I will do my best to provide support."},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":10,"completion_tokens":95,"total_tokens":105},"created":1735103573,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-7de0bd64-341a-9196-b676-99b5644ec111"}%
regular-user はレート制限されています
{"choices":[{"message":{"role":"assistant","content":"私は Alibaba Cloud の大規模言語モデルです。私の名前は Tongyi Qianwen です。私は、質問への回答、テキストの作成、意見の表明、コードの作成ができる超大規模言語モデルです。私の知識はインターネット上のテキストから得たものです。複数回の反復と最適化を経て、私の能力は継続的に向上しています。現在では、テクノロジー、文化、歴史、エンターテインメントなど、さまざまなトピックに関する質問に答えたり、継続的な会話を行ったりすることができます。ご質問やサポートが必要な場合は、お気軽にお知らせください。最善を尽くしてサポートします。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":10,"completion_tokens":95,"total_tokens":105},"created":1735103890,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-1b284b71-f850-95f5-9a7e-12678812763c"}%
{"choices":[{"message":{"role":"assistant","content":"私は Alibaba Cloud の大規模言語モデルです。私の名前は Tongyi Qianwen です。私は、質問への回答、テキストの作成、意見の表明、コードの作成ができる超大規模言語モデルです。私の知識は、Alibaba Cloud の膨大なテキストデータ (さまざまな書籍、ドキュメント、Web ページ、論文など) から得たものであり、さまざまなトピックを理解し、回答できるようにすることを目的としています。ご質問やサポートが必要な場合は、お気軽にお知らせください。最善を尽くしてサポートします。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":10,"completion_tokens":81,"total_tokens":91},"created":1735103895,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-0d29d820-c9c5-9e94-9a5a-d054233ed35a"}
サブスクライバーはレート制限されています