Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Implementar limitação de taxa de tokens de LLM com base em cabeçalhos de requisição

Última atualização: Jun 28, 2026

O Service Mesh (ASM) limita a quantidade de tokens que clientes específicos podem consumir ao chamar serviços de modelos de linguagem grandes (LLM). O sistema aplica os limites de taxa com base em atributos da requisição, como atributos TCP, cabeçalhos HTTP, caminhos, hosts e destinos de rota. Quando um cliente excede seu orçamento de tokens, o sidecar proxy retorna uma resposta de limitação de taxa em vez de encaminhar a requisição para o serviço de LLM upstream.

Casos de uso

  • Controle de custos da API de LLM: Serviços externos de LLM geralmente cobram pelo consumo de tokens. A limitação de taxa de tokens estabelece um teto de gastos por cliente ou nível de usuário, evitando aumentos inesperados nos custos.

  • Proteção de serviços de inferência compartilhados: Quando clientes externos chamam serviços de inferência no seu cluster, a limitação de taxa de tokens impede que um único cliente monopolize os recursos computacionais e degrade a disponibilidade para os demais.

Como funciona

O ASM implementa a limitação de taxa de tokens de LLM por meio de dois componentes construídos sobre WebAssembly (Wasm):

  • Plug-in de limitação de taxa -- Um plug-in Wasm implantado como filtro sidecar. Ele intercepta cada requisição de LLM de saída, extrai uma chave de limitação de taxa (por exemplo, o valor de um cabeçalho user-type) e consulta o serviço de limitação de taxa para determinar se deve permitir ou rejeitar a requisição.

  • Serviço de limitação de taxa -- Um serviço de backend, mantido pelo cliente, que rastreia o consumo de tokens e aplica as regras de limitação de taxa. O plug-in de limitação de taxa do ASM chama esse serviço usando interfaces HTTP padrão. O ASM fornece uma implementação padrão que utiliza o algoritmo de token bucket com Redis como backend de armazenamento. Para implementar lógica personalizada, crie seu próprio serviço usando qualquer algoritmo (token bucket, leaky bucket ou sliding window). Você também pode ajustar dinamicamente as regras de limitação de taxa com base na carga dos serviços de backend.

Architecture diagram

Fluxo da requisição:

  1. Um cliente envia uma requisição de LLM pelo sidecar proxy.

  2. O plug-in Wasm extrai a chave de limitação de taxa do cabeçalho da requisição.

  3. O plug-in consulta o serviço de limitação de taxa para verificar se a chave excedeu seu orçamento de tokens.

  4. Se houver orçamento restante, o sistema encaminha a requisição para o serviço de LLM. Caso o orçamento tenha sido excedido, o proxy retorna uma resposta de limitação de taxa (por exemplo, regular-user is being rate-limited).

  5. O serviço de LLM processa a requisição e retorna uma resposta que inclui dados de uso de tokens no campo usage (por exemplo, prompt_tokens, completion_tokens e total_tokens).

  6. O plug-in reporta os tokens consumidos ao serviço de limitação de taxa para atualizar o registro.

Nota

A etapa 6 é executada de forma assíncrona e não bloqueia o retorno da resposta do LLM para o cliente.

Pré-requisitos

Antes de começar, certifique-se de ter:

Etapa 1: Implantar o serviço de limitação de taxa

Esta etapa implanta um serviço de limitação de taxa que usa o algoritmo de token bucket para aplicar orçamentos de tokens por usuário. O exemplo define dois níveis de usuário -- regular-user e subscriber -- com diferentes cotas de tokens.

  1. Crie um arquivo chamado token-limit.yaml com o seguinte conteúdo:

    Visualize o conteúdo 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:
            # Redis connection: replace with your Redis endpoint and port
            - name: REDIS_ADDRESS
              value: ${redis-address}:${redis-port}
            # Redis credentials: replace with your Redis username and password
            - name: REDIS_PASSWORD
              value: "${redis-user}:${password}"
            # Rate limiting rules: one entry per user tier
            - 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

    Substitua os seguintes espaços reservados pelos seus valores reais:

    Espaço reservado

    Descrição

    Exemplo

    ${redis-address}

    Endereço do host Redis

    r-bp1xxxxxx.redis.rds.aliyuncs.com

    ${redis-port}

    Número da porta Redis

    6379

    ${redis-user}

    Nome de usuário Redis

    default

    ${password}

    Senha do Redis

    MyP@ssw0rd

    A variável de ambiente RATE_LIMIT_CONFIG define as regras de token bucket. Cada regra corresponde a uma chave de limitação de taxa via regex e aplica um bucket separado:

    Parâmetro

    Descrição

    rate_limit_key_regex

    Padrão regex para corresponder à chave de limitação de taxa extraída do cabeçalho da requisição.

    max_tokens

    Capacidade máxima do token bucket. Requisições que excederiam esse limite são rejeitadas.

    tokens_per_fill

    Quantidade de tokens adicionados ao bucket em cada intervalo de recarga.

    fill_interval_second

    Intervalo de tempo (em segundos) entre as recargas de tokens.

    redis_expired_seconds

    Tempo de vida (TTL) do registro de limitação de taxa no Redis. Após esse período, o registro expira e o bucket é reiniciado.

    A tabela a seguir mostra as regras de limitação de taxa configuradas neste exemplo:

    Regra

    Regex da chave

    Capacidade do bucket

    Taxa de recarga

    TTL no Redis

    Usuário regular

    regular-user.*

    200 tokens

    50 tokens a cada 30s

    300s

    Assinante

    subscriber.*

    1.000 tokens

    100 tokens a cada 60s

    600s

    Os assinantes recebem um bucket 5 vezes maior e mais tokens por recarga, o que permite um uso sustentado de LLM com volume mais elevado.

  2. Aplique a configuração usando o kubeconfig do cluster do plano de dados:

    kubectl apply -f token-limit.yaml
Nota

Esta é a implementação padrão de limitação de taxa fornecida pelo ASM. Para requisitos personalizados, como algoritmos diferentes ou outros backends de armazenamento, consulte o source no GitHub.

Etapa 2: Implantar o plug-in Wasm

Esta etapa implanta um WasmPlugin que configura o sidecar proxy para interceptar requisições de LLM, extrair a chave de limitação de taxa do cabeçalho user-type e verificá-la no serviço de limitação de taxa.

  1. Crie um arquivo chamado wasm.yaml com o seguinte conteúdo:

    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

    A tabela a seguir explica os principais campos de configuração:

    Campo

    Descrição

    .spec.pluginConfig.matches

    Define quais requisições acionam a limitação de taxa. Requisições não correspondidas passam sem verificações de limite de taxa.

    .spec.pluginConfig.rateLimitKeys

    Especifica como extrair a chave de limitação de taxa. Utiliza a sintaxe de atributos de requisição do Envoy. Neste exemplo, {{request.headers.user-type}} extrai o valor do cabeçalho user-type.

    .spec.pluginConfig.rateLimitService

    Especifica o endpoint do serviço de limitação de taxa. Forneça o nome de domínio totalmente qualificado (FQDN) do Kubernetes Service.

  2. Aplique a configuração usando o kubeconfig do cluster do plano de controle:

    kubectl apply -f wasm.yaml

Etapa 3: Verifique a configuração

Envie requisições de teste como ambos os tipos de usuário para confirme que a limitação de taxa funciona corretamente.

Execute cada um dos comandos a seguir várias vezes usando o kubeconfig do cluster do plano de dados.

Como usuário regular:

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"}
      ]
  }'

Como assinante:

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"}
      ]
  }'

Comportamento esperado:

  • As requisições iniciais de ambos os tipos de usuário retornam uma resposta normal de LLM contendo um campo usage com as contagens de tokens.

  • Após várias requisições, o regular-user atinge o limite de taxa primeiro e recebe regular-user is being rate-limited.

  • O subscriber consegue enviar mais requisições antes de sofrer limitação de taxa, confirmando o orçamento de tokens mais alto.

Isso valida que o serviço de limitação de taxa diferencia os níveis de usuário e aplica os orçamentos de tokens configurados.

Próximos passos

  • Personalizar regras de limitação de taxa: Ajuste max_tokens, tokens_per_fill e fill_interval_second no RATE_LIMIT_CONFIG para adequar-se aos padrões de tráfego da sua produção.

  • Criar um serviço de limitação de taxa personalizado: Faça um fork da implementação de exemplo para implementar algoritmos personalizados (leaky bucket, sliding window) ou usar um backend de armazenamento diferente.

  • Estender para mais atributos: Altere rateLimitKeys para extrair chaves de outros atributos da requisição, como caminhos, hosts ou atributos TCP. Consulte Atributos do Envoy para ver as opções disponíveis.