Limitação de taxa

Veja nesta página como usar a infraestrutura de serviços para implementar a limitação de taxa para serviços gerenciados integrados à Service Management API.

Um serviço gerenciado pode atender a muitos consumidores de serviços. Para proteger a capacidade do sistema e garantir o uso justo, um serviço gerenciado geralmente usa limitação de taxa para distribuir a capacidade entre os consumidores de serviços. Com as APIs Service Management e Service Control, é possível gerenciar e aplicar a limitação de taxa.

Como configurar limites de taxa

Para usar o recurso de limitação de taxa, defina _quota metrics_ e _quota limits_ na configuração de serviço do projeto de produtor de serviço.

Atualmente, a limitação de taxa aceita é o número de solicitações por minuto por consumidor do serviço. Nesse cenário, o consumidor do serviço é um projeto do Google Cloud Platform conforme identificado por uma chave de API, um código de projeto ou um número de projeto. Para a limitação de taxa, o conceito de solicitação não é transparente. Um serviço pode escolher, como solicitação, uma solicitação HTTP ou um byte de payload. O recurso de limitação de taxa é independente da semântica de solicitação.

Métricas de cota

Uma métrica é um contador escolhido para medir um determinado valor ao longo do tempo. Por exemplo, o número de solicitações HTTP que um serviço recebe é uma métrica. Uma métrica de cota é usada para fins de limitação de cota e taxa. Quando ocorre uma atividade com um serviço, uma ou mais métricas de cota podem aumentar. Quando o valor da métrica atinge o limite de cota predefinido, o serviço deve rejeitar a atividade com um erro 429.

Limites de cota

Um limite de cota representa um limite aplicável em uma métrica de cota. Por exemplo, o número de solicitações por consumidor do serviço por minuto é um limite de cota. Por enquanto, o único tipo de limite de cota aceito é por minuto por consumidor. Especificamente, 1/min/{project}.

O limite de taxa real de um par (serviço, consumidor) é controlado por três configurações:

  • limite padrão especificado para o serviço gerenciado
  • modificação do produtor do serviço para o consumidor do serviço
  • modificação do consumidor do serviço para o consumidor do serviço

O limite de taxa efetivo é o seguinte:

  • O limite padrão, se não houver modificação.
  • A modificação do produtor do serviço, se houver uma modificação do produtor, mas nenhuma modificação do consumidor do serviço.
  • O mínimo (modificação do consumidor do serviço, limite padrão), se houver uma modificação do consumidor, mas nenhuma modificação do produtor do serviço.
  • O mínimo (modificação do consumidor e do produtor do serviço), se houver modificações de produtor e consumidor do serviço.

Como aplicar a limitação de taxa

Para aplicar a limitação de taxa, cada servidor que pertença a um serviço gerenciado precisa chamar o método services.allocateQuota da API Service Control regularmente. Se a resposta do método services.allocateQuota indicar que o uso está acima do limite, o servidor rejeitará a solicitação recebida com um erro 429. Para mais informações, consulte a documentação de referência do método services.allocateQuota.

Recomenda-se que cada servidor use lote, cache e lógica preditiva para melhorar o desempenho e a confiabilidade do sistema. Em geral, um servidor só pode chamar o método services.allocateQuota uma vez por segundo para a mesma tupla (serviço, consumidor, métrica).

No exemplo a seguir, veja como chamar o método services.allocateQuota para verificar a limitação de taxa. Os parâmetros de solicitação importantes que precisam ser definidos corretamente são nome do serviço, código do consumidor, nome da métrica e valor da métrica. O método services.allocateQuota tentará aumentar o uso pelo valor especificado para a tupla (serviço, consumidor, métrica). Se o uso aumentado for superior ao limite, um erro será retornado. No exemplo a seguir, o comando gcurl é usado para demonstrar a chamada. Para saber como configurar isso, consulte Primeiros passos com a 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"
}

Tratamento de erros

Se o código de resposta HTTP for 200 e a resposta contiver RESOURCE_EXHAUSTED QuotaError, o servidor rejeitará a solicitação com um erro 429. Se a resposta não tiver nenhum erro de cota, o servidor continuará exibindo as solicitações recebidas. Para todos os outros erros de cota, o servidor deverá rejeitar a solicitação com um erro 409. Devido aos riscos de segurança, você precisa ter muito cuidado com as informações de erro incluídas na mensagem de erro.

Para todos os outros códigos de resposta HTTP, é provável que seu servidor tenha algum bug de programação. É recomendável que o servidor continue a veicular as solicitações recebidas enquanto você depura o problema. Se o método services.allocateQuota retornar algum erro inesperado, o serviço registrará o erro e aceitará as solicitações recebidas. Você pode depurar o erro mais tarde.

Fail open

O recurso de limitação de taxa serve para proteger o serviço gerenciado contra sobrecarga e distribuir a capacidade do serviço de modo justo entre os consumidores do serviço. Como a maioria dos consumidores do serviço não deve atingir os respectivos limites de taxa durante as operações normais, o serviço gerenciado deverá aceitar todas as solicitações recebidas se o próprio recurso de limitação de taxa não estiver disponível, o que também é chamado de fail open. Isso impede que a disponibilidade do serviço seja afetada pelo sistema de limitação de taxa.

Ao usar o método services.allocateQuota, seu serviço ignorará os erros 500, 503 e 504 sem qualquer tentativa. Para evitar uma forte dependência do recurso de limitação de taxa, a API Service Control emitirá regularmente uma quantidade limitada de injeções de erro.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Service Infrastructure