Limitação de velocidade

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.