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.
Fluxo da requisição:
Um cliente envia uma requisição de LLM pelo sidecar proxy.
O plug-in Wasm extrai a chave de limitação de taxa do cabeçalho da requisição.
O plug-in consulta o serviço de limitação de taxa para verificar se a chave excedeu seu orçamento de tokens.
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).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_tokensetotal_tokens).O plug-in reporta os tokens consumidos ao serviço de limitação de taxa para atualizar o registro.
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:
Uma instância do ASM (versão 1.23 ou posterior) com um cluster adicionado
Um LLMProvider e recursos relacionados, implantados após concluir as etapas 1 e 2 em Roteamento de tráfego: Use o ASM para gerenciar eficientemente o tráfego de LLM
Um serviço Redis acessível a partir do cluster. Para criar uma instância gerenciada, consulte Início rápido do Tair (compatível com Redis OSS)
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.
-
Crie um arquivo chamado
token-limit.yamlcom o seguinte conteúdo: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@ssw0rdA variável de ambiente
RATE_LIMIT_CONFIGdefine 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_regexPadrão regex para corresponder à chave de limitação de taxa extraída do cabeçalho da requisição.
max_tokensCapacidade máxima do token bucket. Requisições que excederiam esse limite são rejeitadas.
tokens_per_fillQuantidade de tokens adicionados ao bucket em cada intervalo de recarga.
fill_interval_secondIntervalo de tempo (em segundos) entre as recargas de tokens.
redis_expired_secondsTempo 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.
-
Aplique a configuração usando o kubeconfig do cluster do plano de dados:
kubectl apply -f token-limit.yaml
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.
-
Crie um arquivo chamado
wasm.yamlcom 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-aliyunA tabela a seguir explica os principais campos de configuração:
Campo
Descrição
.spec.pluginConfig.matchesDefine quais requisições acionam a limitação de taxa. Requisições não correspondidas passam sem verificações de limite de taxa.
.spec.pluginConfig.rateLimitKeysEspecifica 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çalhouser-type..spec.pluginConfig.rateLimitServiceEspecifica o endpoint do serviço de limitação de taxa. Forneça o nome de domínio totalmente qualificado (FQDN) do Kubernetes Service.
-
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
usagecom as contagens de tokens.Após várias requisições, o
regular-useratinge o limite de taxa primeiro e receberegular-user is being rate-limited.O
subscriberconsegue 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_fillefill_interval_secondnoRATE_LIMIT_CONFIGpara 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
rateLimitKeyspara 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.