비율 제한

이 페이지에서는 서비스 인프라를 사용해 Service Management API와 통합되는 관리형 서비스의 비율 제한을 구현하는 방법을 설명합니다.

관리형 서비스는 많은 서비스 소비자에게 제공될 수 있습니다. 시스템 용량을 확보하고 공정한 사용을 보장하기 위해 관리형 서비스에서는 종종 비율 제한을 사용해 여러 서비스 소비자에게 용량을 배포합니다. Service ManagementService Control API를 사용하면 비율 제한을 관리하고 적용할 수 있습니다.

비율 제한 구성

비율 제한 기능을 사용하려면 서비스 제작자 프로젝트의 서비스 구성에서 _quota metrics__quota limits_를 구성합니다.

현재 지원되는 비율 제한은 서비스 소비자별 분당 요청 수입니다. 여기서 서비스 소비자는 API 키, 프로젝트 ID, 프로젝트 번호로 식별되는 Google Cloud 프로젝트입니다. 비율 제한에서는 요청의 개념이 불분명합니다. 서비스는 HTTP 요청을 요청으로 선택하거나 페이로드 바이트를 요청으로 선택할 수 있습니다. 비율 제한 기능은 요청 의미와 무관합니다.

할당량 측정항목

측정항목이란 특정 값을 시간에 따라 측정하는 이름이 지정된 카운터입니다. 측정항목의 예로는 서비스에서 수신하는 HTTP 요청 수를 들 수 있습니다. 할당량 측정항목이란 할당량 및 비율 제한에 사용되는 측정항목입니다. 서비스에서 활동이 발생하면 하나 이상의 할당량 측정항목이 증가할 수 있습니다. 측정항목 값이 사전 정의된 할당량 제한에 도달하면 서비스에서 429 오류를 반환하며 활동을 거부합니다.

할당량 제한

할당량 제한은 할당량 측정항목에 적용 가능한 제한을 의미합니다. 할당량 제한의 예로는 서비스 소비자별 분당 요청 수를 들 수 있습니다. 현재 지원되는 할당량 제한 유형으로는 소비자별 분당 할당량 제한인 1/min/{project}가 유일합니다.

(서비스, 소비자) 쌍의 실제 비율 제한은 3가지 설정으로 제어됩니다.

  • 관리형 서비스에 지정된 기본 제한
  • 서비스 소비자에 대한 서비스 프로듀서 재정의
  • 서비스 소비자에 대한 서비스 소비자 재정의

유효한 비율 제한:

  • 재정의가 없는 경우 기본 제한
  • 서비스 제작자 재정의가 존재하나 서비스 소비자 재정의가 없는 경우 서비스 제작자 재정의
  • 서비스 소비자 재정의가 존재하나 서비스 제작자 재정의가 없는 경우 최소 제한(서비스 소비자 재정의, 기본 제한)
  • 서비스 제작자 및 서비스 소비자 재정의가 모두 존재하는 경우 최소 제한(서비스 소비자 재정의, 서비스 제작자 재정의)

비율 제한 적용

비율 제한을 적용하려면 관리형 서비스에 속한 각 서버에서 Service Control API services.allocateQuota 메소드를 정기적으로 호출해야 합니다. services.allocateQuota 메서드에서 사용량이 제한을 초과한다고 응답하면 서버에서 429 오류를 반환하며 수신 요청을 거부합니다. 자세한 내용은 services.allocateQuota 메서드의 참조 문서를 확인하세요.

각 서버에서 일괄 처리, 캐싱, 예측 로직을 사용해 시스템 성능 및 안정성을 개선하는 것이 좋습니다. 일반적으로 한 서버에서 동일(서비스, 소비자, 측정항목) 튜플별로 services.allocateQuota 메서드를 초당 한 번만 호출해야 합니다.

다음 예시에서는 비율 제한을 확인하기 위해 services.allocateQuota 메서드를 호출하는 방법을 보여줍니다. 서비스 이름, 소비자 ID, 측정항목 이름, 측정항목 값은 중요한 요청 매개변수로 올바르게 설정해야 합니다. services.allocateQuota 메서드는 (서비스, 소비자, 측정항목) 튜플의 사용량을 지정된 양만큼 늘리려고 시도합니다. 증가된 사용량이 제한을 초과하면 오류가 반환됩니다. 다음 예시에서는 gcurl 명령어를 사용하여 호출을 보여줍니다. 설정하는 방법을 알아보려면 Service Control API 시작하기를 참조하세요.

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

오류 처리

HTTP 응답 코드가 200이고 응답에 RESOURCE_EXHAUSTED QuotaError가 포함된 경우 서버에서 429 오류를 반환하며 요청을 거부합니다. 응답에 할당량 오류가 포함되어 있지 않으면 서버에서 수신 요청을 계속 처리합니다. 그 밖의 모든 할당량 오류의 경우 서버가 409 오류를 반환하며 요청을 거부합니다. 보안 위험으로 인해 오류 메시지에 포함할 오류 정보에 대해 신중을 기해야 합니다.

그 밖의 모든 HTTP 응답 코드의 경우에는 서버에 프로그래밍 버그가 발생할 가능성이 있습니다. 사용자가 문제를 디버그하는 동안 서버에서 계속 수신 요청을 처리하는 것이 좋습니다. services.allocateQuota 메소드에서 예상치 못한 오류를 반환하면 서비스에서 오류를 로깅하고 수신 요청을 수락합니다. 나중에 오류를 디버그할 수 있습니다.

Fail Open

비율 제한은 관리형 서비스를 과부하로부터 보호하고 서비스 용량을 여러 서비스 소비자에게 공정하게 배포하기 위한 기능입니다. 대부분의 서비스 소비자는 일반적인 작업 중에 비율 제한에 도달하지 않으므로 비율 제한 기능을 사용할 수 없는 경우 관리형 서비스에서 수신 요청을 모두 수락하며 이를 Fail Open이라고 부릅니다. 이 경우 서비스 가용성이 비율 제한 시스템의 영향을 받지 않습니다.

services.allocateQuota 메서드를 사용하면 서비스에서 500, 503, 504 오류를 무시하고 재시도하지 않습니다. 비율 제한 기능에 너무 의존하지 않도록 Service Control API에서는 정기적으로 제한된 양의 오류 삽입을 발행합니다.