Esta página descreve como usar a infraestrutura de serviços para implementar a limitação de taxas para serviços geridos que estão integrados com a API Service Management.
Um serviço gerido pode servir muitos consumidores de serviços. Para proteger a capacidade do sistema e garantir uma utilização justa, um serviço gerido usa frequentemente limites de taxa para distribuir a respetiva capacidade entre os consumidores do serviço. As APIs Service Management e Service Control permitem-lhe gerir e aplicar limites de taxa.
Configurar limites de taxa
Para usar a funcionalidade de limitação de taxa, configure _quota metrics_
e
_quota limits_
na configuração do serviço para o seu projeto de
produtor de serviços.
Atualmente, a limitação de taxa suportada é o número de pedidos por minuto por consumidor de serviço, em que o consumidor de serviço é um Google Cloud projeto identificado por uma chave API, um ID do projeto ou um número do projeto. Para a limitação de taxa, o conceito de pedido é um conceito opaco. Um serviço pode escolher um pedido HTTP como um pedido ou um byte de carga útil como um pedido. A funcionalidade de limitação de velocidade é independente da semântica de um pedido.
Métricas de quota
Uma métrica é um contador com nome para medir um determinado valor ao longo do tempo. Por exemplo, o número de pedidos HTTP que um serviço recebe é uma métrica. Uma métrica de quota é uma métrica usada para fins de quota e limitação de taxa. Quando ocorre uma atividade com um serviço, uma ou mais métricas de quota podem aumentar. Quando o valor da métrica atinge o limite da quota predefinido, o serviço deve rejeitar a atividade com um erro 429
.
Limites de quota
Um limite de quota representa um limite aplicável numa métrica de quota. Por exemplo, o número de pedidos por consumidor de serviços por minuto é um limite de quota. Neste momento, o único tipo de limite de quota suportado é por minuto por consumidor, especificamente, 1/min/{project}
.
O limite de taxa real para um par (serviço, consumidor) é controlado por 3 definições:
- O limite predefinido especificado para o serviço gerido.
- A substituição do produtor de serviços para o consumidor de serviços.
- A substituição do consumidor de serviços para o consumidor de serviços.
O limite de taxa efetivo é:
- O limite predefinido se não houver substituição.
- A substituição do produtor de serviços se existir uma substituição do produtor de serviços, mas não uma substituição do consumidor de serviços.
- O mínimo(substituição do consumidor de serviços, limite predefinido) se existir uma substituição do consumidor de serviços, mas não uma substituição do produtor de serviços.
- O mínimo(substituição do consumidor de serviços, substituição do produtor de serviços) se existirem substituições do produtor de serviços e do consumidor de serviços.
Aplicação da limitação de velocidade
Para aplicar a limitação de taxa, cada servidor pertencente a um serviço gerido tem de chamar o método services.allocateQuota
da API Service Control regularmente. Se a resposta do método services.allocateQuota
indicar que a utilização está acima do limite, o servidor deve rejeitar o pedido recebido com um erro 429
. Para mais informações, consulte a documentação de referência do método services.allocateQuota
.
Recomendamos que cada servidor use o processamento em lote, a colocação em cache e a lógica preditiva para melhorar o desempenho e a fiabilidade do sistema. Em geral, um servidor só deve chamar o método services.allocateQuota
uma vez por segundo para a mesma tupla (serviço, consumidor, métrica).
O exemplo seguinte demonstra como chamar o método services.allocateQuota
para verificar se existem limites de taxa. Os parâmetros de pedido importantes que têm de ser definidos corretamente são o nome do serviço, o ID do consumidor, o nome da métrica e o valor da métrica. O método
services.allocateQuota
tenta aumentar a utilização pelo valor especificado para a tupla (serviço, consumidor, métrica). Se o aumento da utilização exceder o limite, é devolvido um erro. O exemplo seguinte usa o comando gcurl
para demonstrar a chamada. Para saber como configurar esta opção, consulte o artigo
Introdução à API Service Control.
gcurl -d '{ "allocateOperation": { "operationId": "123e4567-e89b-12d3-a456-426655440000", "methodName": "google.example.hello.v1.HelloService.GetHello", "consumerId": "project:endpointsapis-consumer", "quotaMetrics": [{ "metricName": "endpointsapis.appspot.com/requests", "metricValues": [{ "int64Value": 1 }] }], "quotaMode": "NORMAL" } }' https://servicecontrol.googleapis.com/v1/services/endpointsapis.appspot.com:allocateQuota { "operationId": "123e4567-e89b-12d3-a456-426655440000", "quotaMetrics": [ { "metricName": "serviceruntime.googleapis.com/api/consumer/quota_used_count", "metricValues": [ { "labels": { "/quota_name": "endpointsapis.appspot.com/requests" }, "int64Value": "1" } ] } ], "serviceConfigId": "2017-09-10r0" }
Processamento de erros
Se o código de resposta HTTP for 200
e a resposta contiver
RESOURCE_EXHAUSTED
QuotaError
,
o seu servidor deve rejeitar o pedido com um erro 429
. Se a resposta não contiver nenhum erro de quota, o seu servidor deve continuar a publicar os pedidos recebidos. Para todos os outros erros de quota, o seu servidor deve rejeitar o pedido com um erro 409
. Devido aos riscos de segurança, tem de ter muito cuidado com as informações de erro que inclui na mensagem de erro.
Para todos os outros códigos de resposta HTTP, é provável que o seu servidor tenha um erro de programação. Recomendamos que o servidor continue a publicar os pedidos recebidos enquanto
depura o problema. Se o método
services.allocateQuota
devolver um erro inesperado, o seu serviço deve registar o erro e
aceitar os pedidos de rendimento. Pode depurar o erro mais tarde.
Falha na abertura
A funcionalidade de limitação de taxa destina-se a proteger o seu serviço gerido contra sobrecargas e a distribuir a capacidade do seu serviço de forma justa entre os consumidores do serviço. Uma vez que a maioria dos consumidores de serviços não deve atingir os respetivos limites de taxa durante as operações normais, o seu serviço gerido deve aceitar todos os pedidos recebidos se a funcionalidade de limitação de taxa não estiver disponível, também conhecida como fail open. Isto impede que a disponibilidade do seu serviço seja afetada pelo sistema de limitação de taxa.
Se usar o método services.allocateQuota
, o seu serviço tem de ignorar os erros 500
, 503
e 504
sem qualquer nova tentativa. Para evitar uma dependência rígida da funcionalidade de limitação de taxa, a API Service Control emite uma quantidade limitada de injeção de erros de forma regular.