# Základní omezení rychlosti v univerzálním RateLimiter .NET: architektura a algoritmy
Univerzální komponenta omezení rychlosti .NET obsahuje čtyři základní algoritmická omezení: FixedWindowRateLimiter, SlidingWindowRateLimiter, TokenBucketRateLimiter a ConcurrencyLimiter. První implementuje pevné okno, druhé – posunuté okno, třetí – tokenový kýbl, čtvrté omezuje paralelizmus.
Třídy omezení rychlosti dědí z ReplenishingRateLimiter, který definuje logiku doplňování povolení podle časovače. ConcurrencyLimiter dědí přímo z RateLimiter. Konstruktory přijímají parametry nastavení, které se ukládají do kopie Options.
Všechny implementují AttemptAcquireCore (synchronní), AcquireAsyncCore (asynchronní), Dispose/DisposeAsync. Omezení rychlosti navíc přidávají ReplenishInternal.
Zpracování žádostí o povolení
Žádosti se dělí na zkušební (permitCount = 0) a skutečné (permitCount > 0). Záporná hodnota vyvolá ArgumentOutOfRangeException.
Algoritmus zpracování:
- Kontrola permitCount ≤ AutoReplenishment.MaxPermits.
- Pro zkušební: pokud availablePermits > 0 – okamžitý úspěch.
- Blokování na Lock (deque fronty).
- Pokud availablePermits ≥ permitCount – udělení, decrement, odblokování.
- Jinak: synchronní zamítnutí nebo zařazení do fronty (asynchronně).
Asynchronní metoda vrací ValueTask<RateLimitLease>. Při přeplnění fronty – zamítnutí.
Struktura fronty žádostí
Fronta je deque<RequestRegistration>, kde RequestRegistration dědí z TaskCompletionSource<RateLimitLease>.
Nastavení fronty v Options:
- QueueLimit: maximální součet permitCount ve frontě.
- QueueProcessingOrder: OldestFirst (FIFO, výchozí) nebo NewestFirst (LIFO).
Aktuální velikost: _queueTotalPermits. Blokování na deque.
Při doplňování povolení: Dequeue, CompleteTask s úspěšným Lease, decrement _queueTotalPermits.
Vrácení Lease a statistika
Metody vrací odvozené třídy z RateLimitLease:
- FixedWindowLease, SlidingWindowLease, TokenBucketLease (podobné).
- ConcurrencyLease (lišící se).
Počítadla: _successfulAcquires, _failedAcquires (Interlocked.Increment).
RateLimiterStatistics kopíruje:
- AvailablePermits.
- CurrentQueueLength.
- Počítadla.
Vlastnost IdleDuration: doba nečinnosti bez žádostí.
Specifické vlastnosti každého omezení
FixedWindowRateLimiter
Pevné okno: povolení se doplňují na začátku okna (permitPeriod).
_availablePermits se resetuje na MaxPermits.
SlidingWindowRateLimiter
Posunuté okno: sleduje historii v SlidingWindowSize segmentech (segmentSize = permitPeriod / SlidingWindowSize).
Obnovuje na základě předchozích segmentů.
TokenBucketRateLimiter
Tokenový kýbl: _tokens se doplňuje s ReplenishmentPeriod, rate = TokensPerPeriod.
Omezuje spotřebu podle refillAmount.
ConcurrencyLimiter
Omezuje _currentConcurrency ≤ PermitLimit.
Fronta spouští úlohy po dokončení aktivních (OnCompleted).
Co je důležité
- Univerzálnost: základní omezení tvoří základ ASP.NET Core rate limiting, lze je použít i mimo webový kontext.
- Fronta: podpora FIFO/LIFO, limit podle součtu permits, asynchronní provádění.
- Zkušební žádosti: permitCount=0 pro kontrolu bez spotřeby.
- Statistika: atomická počítadla + metrika v reálném čase.
- Doplňování: řízené časovačem pro všechny ReplenishingRateLimiter.
— Editorial Team
Zatím žádné komentáře.