요청 속도 제한

요청 속도 제한 (Request Rate Limits)

이 문서는 메시 안의 서비스에 대한 요청 속도를 제한하도록 Consul을 구성하는 방법을 설명해요. 서비스 전체 경로에 대한 제한과 특정 URL 경로에 대한 제한을 VM과 Kubernetes 구성으로 어떻게 설정하는지 다룰게요. 이 기능은 Consul Enterprise에서 사용할 수 있어요.

출처: 문서

본문

이 문서는 메시 안의 서비스에 대한 요청 속도를 제한하도록 Consul을 구성하는 방법을 설명합니다.

Enterprise

이 기능은 Consul Enterprise에서 사용할 수 있습니다.

소개 (Introduction)

Consul을 사용하면 메시 안의 소스에서 서비스가 받는 HTTP 요청의 속도를 제한하는 설정을 구성할 수 있습니다. 요청 속도를 제한하는 것은 탄력적이고 고가용성 네트워크를 구축하는 한 가지 전략입니다.

Consul은 서비스 인스턴스별로 속도 제한을 적용합니다. 예를 들어 서비스에 초당 100 요청(RPS)의 속도 제한을 지정하고 서비스 인스턴스가 5개 있으면 서비스는 총 500 RPS를 수락합니다. 이는 인스턴스당 100 RPS와 같습니다.

서비스에 대한 모든 트래픽의 요청 속도를 제한할 수 있을 뿐 아니라, 서비스의 특정 URL 경로에 대한 속도 제한도 설정할 수 있습니다. 서비스에 여러 속도 제한이 구성되면 Consul은 첫 번째 일치 경로에 대해 구성된 제한을 적용합니다. 결과적으로 서비스의 최대 RPS는 서비스에 배포된 서비스 인스턴스 수에 그 서비스에 구성된 속도 제한 또는 경로의 속도 제한을 곱한 값과 같습니다.

요구 사항 (Requirements)

Consul Enterprise v1.17.0 이상

모든 경로의 서비스에 요청 속도 제한 (Limit request rates to a service on all paths)

서비스 기본값 구성 항목에서 요청 속도 제한을 지정합니다. 서비스의 기존 service defaults 구성 항목을 생성하거나 편집하고 다음 필드를 지정합니다:

VM

Kubernetes

  1. RateLimits.InstanceLevel.RequestPerSecond: Consul이 서비스에 허용해야 하는 초당 평균 요청 수를 설정합니다. 요청 수는 RequestsMaxBurst 매개변수에 지정된 값까지 순간적으로 이 값을 초과할 수 있지만, Consul은 트랜잭션 속도를 일시적으로 낮춥니다.
  2. RateLimits.InstanceLevel.RequestsMaxBurst: Consul이 서비스에 순간적으로 허용하는 최대 동시 요청 수를 설정합니다. Consul은 이 제한을 초과하는 추가 요청을 차단합니다.

다음 예제는 billing이라는 서비스의 기본 동작을 구성합니다. 이 구성은 billing 서비스의 각 인스턴스를 초당 평균 1000 요청으로 제한하지만 최대 1500개의 동시 요청을 수락할 수 있게 합니다.

Kind = "service-defaults"
Name = "billing"
Protocol = "http"

RateLimit {
  InstanceLevel {
    RequestsPerSecond = 1000
    RequestsMaxBurst = 1500
  }
}
  1. spec.rateLimits.instanceLevel.requestPerSecond: Consul이 서비스에 허용해야 하는 초당 평균 요청 수를 설정합니다. 요청 수는 requestsMaxBurst 매개변수에 지정된 값까지 순간적으로 이 값을 초과할 수 있지만, Consul은 트랜잭션 속도를 일시적으로 낮춥니다.
  2. spec.rateLimits.instanceLevel.requestsMaxBurst: Consul이 서비스에 순간적으로 허용하는 최대 동시 요청 수를 설정합니다. Consul은 이 제한을 초과하는 추가 요청을 차단합니다.

다음 예제는 billing이라는 서비스의 기본 동작을 구성합니다. 이 구성은 billing 서비스의 각 인스턴스를 초당 평균 1000 요청으로 제한하지만 최대 1500개의 동시 요청을 수락할 수 있게 합니다.

kind: ServiceDefaults
name: billing
protocol: http
rateLimit:
  instanceLevel:
    requestsPerSecond: 1000
    requestsMaxBurst: 1500

추가 사양과 예제 구성에 대해서는 service defaults 구성 항목 참조를 참조하세요.

특정 경로에 대한 요청 속도 제한 지정 (Specify request rate limits for specific paths)

서비스 기본값 구성 항목에서 요청 속도 제한을 지정합니다. 서비스의 기존 service defaults 구성 항목을 생성하거나 편집하고 다음 매개변수를 구성합니다:

VM

Kubernetes

  1. 구성 항목에 RateLimits.InstanceLevel.Routes 블록을 추가합니다. 이 블록에는 제한과 제한을 설정할 경로를 결정하기 위한 일치 기준이 포함되어 있습니다.
  2. Routes 블록에서 제한을 설정할 경로를 결정하기 위해 다음 일치 기준 중 하나를 구성합니다:
    • PathExact: 요청 경로에서 일치시킬 정확한 경로를 지정합니다.
    • PathPrefix: 요청 경로에서 일치시킬 경로 접두사를 지정합니다.
    • PathRegex: 요청 경로에서 일치시킬 정규식을 지정합니다.
  3. Routes 블록에서 시행할 제한도 구성합니다. 다음 매개변수를 구성할 수 있습니다:
    • RequestsPerSecond: Consul이 일치하는 경로를 통해 서비스에 허용해야 하는 초당 평균 요청 수를 설정합니다. 요청 수는 RequestsMaxBurst 매개변수에 지정된 값까지 순간적으로 이 값을 초과할 수 있지만 Consul은 트랜잭션 속도를 일시적으로 낮춥니다. 이 구성은 구성 항목의 RateLimits.InstanceLevel.RequestPerSecond 필드에 지정된 값을 재정의합니다.
    • RequestsMaxBurst: Consul이 일치하는 경로를 통해 서비스에 순간적으로 허용하는 최대 동시 요청 수를 설정합니다. Consul은 이 제한을 초과하는 추가 요청을 차단합니다. 이 구성은 구성 항목의 RateLimits.InstanceLevel.RequestsMaxBurst 필드에 지정된 값을 재정의합니다.

다음 예제는 billing이라는 서비스의 기본 동작을 구성합니다. 이 구성은 billing 서비스의 각 인스턴스를 요청을 받은 경로에 따라 제한합니다. /api 접두사가 있는 HTTP 경로에서 요청이 이루어지면 서비스는 평균 500 요청으로 제한됩니다. billing 서비스의 인스턴스가 /login 경로에서 요청을 받으면 초당 평균 100 요청과 500개의 동시 연결로 제한됩니다.

Kind = "service-defaults"
Name = "billing"
Protocol = "http"

RateLimit {
  InstanceLevel {
    Routes = [
      {
         PathPrefix = "/api"
         RequestsPerSecond = 500
      },
      {
         PathPrefix = "/login"
         RequestsPerSecond = 100
         RequestsMaxBurst = 500
      }
    ]
  }
}
  1. 구성 항목에 spec.rateLimits.instanceLevel.routes 블록을 추가합니다. 이 블록에는 제한과 제한을 설정할 경로를 결정하기 위한 일치 기준이 포함되어 있습니다.
  2. routes 블록에서 Consul이 제한을 설정할 경로를 결정하도록 다음 일치 기준 중 하나를 구성합니다:
    • pathExact: 요청 경로에서 일치시킬 정확한 경로를 지정합니다. 이 필드를 사용할 때.
    • pathPrefix: 요청 경로에서 일치시킬 경로 접두사를 지정합니다.
    • pathRegex: 요청 경로에서 일치시킬 정규식을 지정합니다.
  3. routes 블록에서 시행할 제한도 구성합니다. 다음 매개변수를 구성할 수 있습니다:
    • requestsPerSecond: Consul이 일치하는 경로를 통해 서비스에 허용해야 하는 초당 평균 요청 수를 설정합니다. 요청 수는 requestsMaxBurst 매개변수에 지정된 값까지 순간적으로 이 값을 초과할 수 있지만 Consul은 트랜잭션 속도를 일시적으로 낮춥니다. 이 구성은 CRD의 spec.rateLimits.instanceLevel.requestPerSecond 필드에 지정된 값을 재정의합니다.
    • requestsMaxBurst: Consul이 일치하는 경로를 통해 서비스에 순간적으로 허용하는 최대 동시 요청 수를 설정합니다. Consul은 이 제한을 초과하는 추가 요청을 차단합니다. 이 구성은 CRD의 spec.rateLimits.instanceLevel.requestsMaxBurst 필드에 지정된 값을 재정의합니다.

다음 예제는 billing이라는 서비스의 기본 동작을 구성합니다. 이 구성은 billing 서비스의 각 인스턴스를 요청을 받은 경로에 따라 제한합니다. /api 접두사가 있는 HTTP 경로에서 요청이 이루어지면 서비스는 평균 500 요청으로 제한됩니다. billing 서비스의 인스턴스가 /login 경로에서 요청을 받으면 초당 평균 100 요청과 500개의 동시 연결로 제한됩니다.

kind: service-defaults
name: billing
protocol: http
rateLimit:
  instanceLevel:
    routes:
      - pathPrefix: /api
        requestsPerSecond: 500
      - pathPrefix: /login
        requestsPerSecond: 100
        requestsMaxBurst: 500

추가 사양과 예제 구성에 대해서는 service defaults 구성 항목 참조를 참조하세요.

더 알아보기 (Learn more)