Snelheidslimieten

Op deze pagina wordt beschreven hoe u service-infrastructuur kunt gebruiken om snelheidslimieten in te stellen voor beheerde services die zijn geïntegreerd met de Service Management API.

Een beheerde service kan veel servicegebruikers bedienen. Om de systeemcapaciteit te beschermen en een eerlijk gebruik te waarborgen, gebruikt een beheerde service vaak snelheidslimieten om de capaciteit onder de servicegebruikers te verdelen. Met de Service Management en Service Control API's kunt u snelheidslimieten beheren en afdwingen.

Snelheidslimieten configureren

Als u de functie voor snelheidslimieten wilt gebruiken, configureert u _quota metrics_ en _quota limits_ in de serviceconfiguratie voor uw serviceproducentproject.

Momenteel kunt u de ondersteunde snelheidsbeperking instellen met het aantal verzoeken per minuut per servicegebruiker, waarbij de servicegebruiker een Google Cloud Platform-project is dat wordt geïdentificeerd door een API-sleutel, een project-ID of een projectnummer. Bij snelheidslimieten is het concept 'verzoek' ondoorzichtig. Een service kan een HTTP-verzoek of een byte van de payload kiezen als een verzoek. De functie voor snelheidslimieten is onafhankelijk van de semantiek van een verzoek.

Quotumstatistieken

Een statistiek is een benoemde teller voor het meten van een bepaalde waarde in de loop van de tijd. Het aantal HTTP-verzoeken dat een service ontvangt, is bijvoorbeeld een statistiek. Een quotumstatistiek is een statistiek die wordt gebruikt voor quota en snelheidslimieten. Wanneer een activiteit met een service plaatsvindt, kunnen de waarden van een of meer quotumstatistieken toenemen. Wanneer de waarde van de statistiek de vooraf gedefinieerde quotumlimiet bereikt, moet de service de activiteit weigeren en een 429-fout geven.

Quotumlimieten

Een quotumlimiet vertegenwoordigt een limiet voor een quotumstatistiek die kan worden afgedwongen. Het aantal verzoeken per servicegebruiker per minuut is bijvoorbeeld een quotumlimiet. Op dit moment is het enige type quotumlimiet dat wordt ondersteund per minuut per consument, in het bijzonder 1/min/{project}.

De werkelijke snelheidslimiet voor een combinatie van service en gebruiker wordt bepaald door drie instellingen:

  • De standaardlimiet die is opgegeven voor de beheerde service
  • De overschrijvende instelling van de serviceproducent voor de servicegebruiker
  • De overschrijvende instelling van de servicegebruiker voor de servicegebruiker

De daadwerkelijke snelheidslimiet is:

  • De standaardlimiet als er geen overschrijving is
  • De overschrijvende instelling van de serviceproducent, als er wel een overschrijvende instelling van de serviceproducent is, maar niet van de servicegebruiker
  • Het minimum (overschrijvende instelling van de servicegebruiker, standaardlimiet) als er een overschrijvende instelling van de servicegebruiker is, maar geen overschrijvende instelling van de serviceproducent
  • Het minimum (overschrijvende instelling van de servicegebruiker, overschrijvende instelling van de serviceproducent) als er overschrijvende instellingen zijn van zowel de serviceproducent als de servicegebruiker

Snelheidslimieten afdwingen

Om snelheidslimieten af te dwingen, moet elke server die tot een beheerde service behoort de services.allocateQuota-methode van de Service Control API regelmatig aanroepen. Als de reactie van de services.allocateQuota-methode aangeeft dat het gebruik boven de limiet ligt, moet de server het binnenkomende verzoek weigeren en een 429-fout geven. Zie de referentiedocumentatie over de services.allocateQuota-methode voor meer informatie.

Het wordt aanbevolen dat elke server gebruikmaakt van batchverwerking, opslag in het cachegeheugen en voorspellende logica om de systeemprestaties en betrouwbaarheid te verbeteren. Over het algemeen hoeft één server de services.allocateQuota-methode slechts een keer per seconde aan te roepen voor dezelfde tupel van service, gebruiker en statistiek.

In het volgende voorbeeld ziet u hoe u de services.allocateQuota-methode aanroept om de snelheidslimiet te controleren. De belangrijke verzoekparameters die correct moeten worden ingesteld, zijn de servicenaam, de consument-ID, de naam van de statistiek en de waarde van de statistiek. De services.allocateQuota-methode probeert het gebruik te verhogen met het opgegeven aantal voor de tupel van service, gebruiker en statistiek. Als het verhoogde gebruik de limiet overschrijdt, wordt een fout geretourneerd.

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

Probleemoplossing

Als de HTTP-reactiecode 200 is en de reactie RESOURCE_EXHAUSTED QuotaError bevat, moet uw server het verzoek afwijzen en een 429-fout geven. Als de reactie geen quotumfout bevat, moet uw server de inkomende verzoeken blijven aanbieden. Bij alle andere quotumfouten moet uw server het verzoek afwijzen en een 409-fout geven. Vanwege de beveiligingsrisico's moet u erg voorzichtig zijn met de informatie die u in het foutbericht opneemt.

Als u andere HTTP-reactiecodes ziet, bevat uw server waarschijnlijk programmeerfouten. Het wordt aanbevolen dat uw server inkomende verzoeken blijft aanbieden terwijl u het probleem oplost. Als de services.allocateQuota-methode een onverwachte fout retourneert, moet uw service de fout registreren in een logboek en de inkomende verzoeken accepteren. U kunt de fout later oplossen.

Fail open

De functie voor snelheidslimieten is bedoeld om uw beheerde service te beschermen tegen overbelasting en om uw servicecapaciteit eerlijk te verdelen onder servicegebruikers. Omdat de meeste servicegebruikers hun snelheidslimieten niet zullen bereiken tijdens normale bewerkingen, moet uw beheerde service alle inkomende verzoeken accepteren als de functie voor snelheidslimieten niet beschikbaar is. Dit noemen we ook wel 'fail open'. Dit voorkomt dat de beschikbaarheid van uw service wordt beïnvloed door het systeem voor snelheidsbeperking.

Als u de services.allocateQuota-methode gebruikt, moet uw service 500-, 503- en 504-fouten negeren zonder opnieuw te proberen. Om een harde afhankelijkheid van de functie voor snelheidslimieten te voorkomen, geeft de Service Control API regelmatig een injectie met een beperkt aantal fouten af.