홈으로 돌아가기

기본 RateLimiter .NET: 알고리즘 및 큐

이 기사는 .NET의 범용 RateLimiter의 기본 알고리즘 제한기를 분석합니다: FixedWindow, SlidingWindow, TokenBucket 및 ConcurrencyLimiter. 요청 처리, FIFO/LIFO 큐, Lease 및 통계를 설명합니다. 시니어 개발자를 위한 자료.

.NET의 기본 RateLimiter 제한기 아키텍처
Advertisement 728x90

# # 유니버설 .NET RateLimiter의 기본 속도 제한기: 아키텍처와 알고리즘

유니버설 .NET 속도 제한 구성 요소에는 네 가지 기본 알고리즘 제한기가 포함되어 있습니다: FixedWindowRateLimiter, SlidingWindowRateLimiter, TokenBucketRateLimiter, 그리고 ConcurrencyLimiter. 첫 번째는 고정 윈도우를 구현하며, 두 번째는 슬라이딩 윈도우를, 세 번째는 토큰 버킷을, 네 번째는 동시성을 제한합니다.

Rate limiter 클래스들은 타이머를 통해 허가를 보충하는 로직을 정의하는 ReplenishingRateLimiter를 상속받습니다. ConcurrencyLimiter는 RateLimiter를 직접 상속받습니다. 생성자는 구성 매개변수를 받아 Options의 복사본에 저장합니다.

모두 AttemptAcquireCore(동기), AcquireAsyncCore(비동기), Dispose/DisposeAsync를 구현합니다. 속도 제한기들은 또한 ReplenishInternal을 추가합니다.

Google AdInline article slot

허가 요청 처리

요청은 시험 요청(permitCount = 0)과 실제 요청(permitCount > 0)으로 나뉩니다. 음수 값은 ArgumentOutOfRangeException을 발생시킵니다.

처리 알고리즘:

  • permitCount ≤ AutoReplenishment.MaxPermits인지 확인합니다.
  • 시험 요청의 경우: availablePermits > 0이면 즉시 성공.
  • 큐 deque에 대한 락 획득.
  • availablePermits ≥ permitCount이면 허가를 부여하고 감소시킨 후 락 해제.
  • 그렇지 않으면: 동기 거부 또는 큐에 추가(비동기).

비동기 메서드는 ValueTask<RateLimitLease>를 반환합니다. 큐 오버플로우 시 거부.

Google AdInline article slot

요청을 위한 큐 구조

큐는 deque<RequestRegistration>이며, RequestRegistration은 TaskCompletionSource<RateLimitLease>를 상속받습니다.

Options의 큐 설정:

  • QueueLimit: 큐 내 permitCount의 최대 합계.
  • QueueProcessingOrder: 가장 오래된 것 먼저(선입선출, 기본값) 또는 가장 최근 것 먼저(후입선출).

현재 크기: _queueTotalPermits. deque에 대한 락.

Google AdInline article slot

허가 보충 시: Dequeue하고 성공적인 Lease로 CompleteTask하며 _queueTotalPermits 감소.

Lease 반환과 통계

메서드들은 RateLimitLease의 파생을 반환합니다:

  • FixedWindowLease, SlidingWindowLease, TokenBucketLease(유사).
  • ConcurrencyLease(다름).

카운터: _successfulAcquires, _failedAcquires(Interlocked.Increment).

RateLimiterStatistics는 다음을 제공합니다:

  • AvailablePermits.
  • CurrentQueueLength.
  • 카운터.

IdleDuration 속성은 요청 없이 유휴 상태로 보낸 시간을 추적합니다.

각 제한기의 특징

FixedWindowRateLimiter

고정 윈도우: 허가는 윈도우 시작(permitPeriod)에 보충됩니다.

_availablePermits는 MaxPermits로 재설정됩니다.

SlidingWindowRateLimiter

슬라이딩 윈도우: SlidingWindowSize 세그먼트(세그먼트 크기 = permitPeriod / SlidingWindowSize) 전반의 이력을 추적합니다.

이전 세그먼트에 기반해 복원합니다.

TokenBucketRateLimiter

토큰 버킷: _tokens는 ReplenishmentPeriod마다 보충되며, 속도 = TokensPerPeriod.

refillAmount에 기반한 지출 제한.

ConcurrencyLimiter

_currentConcurrency ≤ PermitLimit 제한.

활성 작업 완료 시(OnCompleted) 큐에서 작업 실행.

주요 포인트

  • 다재다능함: 기본 제한기들은 ASP.NET Core 속도 제한의 기반을 형성하며 웹 컨텍스트 외부에서도 적용 가능합니다.
  • : 선입선출/후입선출 지원, 총 허가 합계로 제한, 비동기 실행.
  • 시험 요청: 소비 없이 확인을 위한 permitCount=0.
  • 통계: 원자적 카운터 + 실시간 메트릭.
  • 보충: 모든 ReplenishingRateLimiter에 대한 타이머 기반.

— Editorial Team

Advertisement 728x90

다음 읽기