# # 유니버설 .NET RateLimiter의 기본 속도 제한기: 아키텍처와 알고리즘
유니버설 .NET 속도 제한 구성 요소에는 네 가지 기본 알고리즘 제한기가 포함되어 있습니다: FixedWindowRateLimiter, SlidingWindowRateLimiter, TokenBucketRateLimiter, 그리고 ConcurrencyLimiter. 첫 번째는 고정 윈도우를 구현하며, 두 번째는 슬라이딩 윈도우를, 세 번째는 토큰 버킷을, 네 번째는 동시성을 제한합니다.
Rate limiter 클래스들은 타이머를 통해 허가를 보충하는 로직을 정의하는 ReplenishingRateLimiter를 상속받습니다. ConcurrencyLimiter는 RateLimiter를 직접 상속받습니다. 생성자는 구성 매개변수를 받아 Options의 복사본에 저장합니다.
모두 AttemptAcquireCore(동기), AcquireAsyncCore(비동기), Dispose/DisposeAsync를 구현합니다. 속도 제한기들은 또한 ReplenishInternal을 추가합니다.
허가 요청 처리
요청은 시험 요청(permitCount = 0)과 실제 요청(permitCount > 0)으로 나뉩니다. 음수 값은 ArgumentOutOfRangeException을 발생시킵니다.
처리 알고리즘:
- permitCount ≤ AutoReplenishment.MaxPermits인지 확인합니다.
- 시험 요청의 경우: availablePermits > 0이면 즉시 성공.
- 큐 deque에 대한 락 획득.
- availablePermits ≥ permitCount이면 허가를 부여하고 감소시킨 후 락 해제.
- 그렇지 않으면: 동기 거부 또는 큐에 추가(비동기).
비동기 메서드는 ValueTask<RateLimitLease>를 반환합니다. 큐 오버플로우 시 거부.
요청을 위한 큐 구조
큐는 deque<RequestRegistration>이며, RequestRegistration은 TaskCompletionSource<RateLimitLease>를 상속받습니다.
Options의 큐 설정:
- QueueLimit: 큐 내 permitCount의 최대 합계.
- QueueProcessingOrder: 가장 오래된 것 먼저(선입선출, 기본값) 또는 가장 최근 것 먼저(후입선출).
현재 크기: _queueTotalPermits. deque에 대한 락.
허가 보충 시: 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
아직 댓글이 없습니다.