Zpět na domů

Základní RateLimiter .NET: algoritmy a fronty

Článek rozebírá základní algoritmické omezovače univerzálního RateLimiter v .NET: FixedWindow, SlidingWindow, TokenBucket a ConcurrencyLimiter. Popsáno zpracování požadavků, fronty FIFO/LIFO, Lease a statistika. Materiál pro senior vývojáře.

Architektura základních omezovačů RateLimiter v .NET
Advertisement 728x90

# 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.

Google AdInline article slot

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í.

Google AdInline article slot

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.

Google AdInline article slot

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

Advertisement 728x90

Číst dál