Stručný sprievodca k Guava RateLimiter

1. Prehľad

V tomto článku sa pozrieme na RateLimiter triedy z Guava knižnica.

The RateLimiter trieda je konštrukt, ktorý nám umožňuje regulovať rýchlosť, akou niektoré procesy prebiehajú. Ak vytvoríme a RateLimiter s N povoleniami - to znamená, že proces môže vydať najviac N povolení za sekundu.

2. Závislosť od Maven

Budeme používať knižnicu Guava:

 com.google.guava guava 29.0-jre 

Najnovšiu verziu nájdete tu.

3. Tvorba a používanie RateLimiter

Povedzme, že chceme obmedziť mieru vykonávania doSomeLimitedOperation () až 2 krát za sekundu.

Môžeme vytvoriť RateLimiter napríklad pomocou jeho vytvoriť () továrenská metóda:

RateLimiter rateLimiter = RateLimiter.create (2);

Ďalej s cieľom získať povolenie na exekúciu od RateLimiter, musíme zavolať získať () metóda:

rateLimiter.acquire (1);

Aby sme skontrolovali, či to funguje, urobíme 2 nasledujúce hovory na obmedzenú metódu:

long startTime = ZonedDateTime.now (). getSecond (); rateLimiter.acquire (1); doSomeLimitedOperation (); rateLimiter.acquire (1); doSomeLimitedOperation (); long elapsedTimeSeconds = ZonedDateTime.now (). getSecond () - startTime;

Aby sme zjednodušili naše testovanie, predpokladajme to doSomeLimitedOperation () metóda sa dokončuje okamžite.

V takom prípade sa obidve výzvy získať () metóda by nemala blokovať a uplynulý čas by mal byť kratší alebo kratší ako jedna sekunda - pretože obe povolenia je možné získať okamžite:

assertThat (elapsedTimeSeconds <= 1);

Ďalej môžeme získať všetky povolenia v jednom získať () hovor:

@Test public void givenLimitedResource_whenRequestOnce_thenShouldPermitWithoutBlocking () {// daný RateLimiter rateLimiter = RateLimiter.create (100); // keď dlhý startTime = ZonedDateTime.now (). getSecond (); rateLimiter.acquire (100); doSomeLimitedOperation (); long elapsedTimeSeconds = ZonedDateTime.now (). getSecond () - startTime; // potom assertThat (elapsedTimeSeconds <= 1); }

To môže byť užitočné, ak napríklad potrebujeme poslať 100 bajtov za sekundu. Môžeme poslať stokrát jeden bajt a získať jedno povolenie súčasne. Na druhej strane môžeme naraz poslať všetkých 100 bajtov a získať všetkých 100 povolení v jednej operácii.

4. Získavanie povolení blokujúcim spôsobom

Uvažujme teraz o niečo zložitejší príklad.

Vytvoríme RateLimiter so 100 povoleniami. Potom vykonáme akciu, ktorá vyžaduje získanie 1 000 povolení. Podľa špecifikácie RateLimiter, táto akcia bude trvať najmenej 10 sekúnd, pretože sme schopní vykonať iba 100 jednotiek akcie za sekundu:

@Test public void givenLimitedResource_whenUseRateLimiter_thenShouldLimitPermits () {// daný RateLimiter rateLimiter = RateLimiter.create (100); // keď dlhý startTime = ZonedDateTime.now (). getSecond (); IntStream.range (0, 1 000) .forEach (i -> {rateLimiter.acquire (); doSomeLimitedOperation ();}); long elapsedTimeSeconds = ZonedDateTime.now (). getSecond () - startTime; // potom assertThat (elapsedTimeSeconds> = 10); }

Všimnite si, ako používame získať () metóda tu - toto je metóda blokovania a pri jej používaní by sme mali byť opatrní. Keď získať () metóda sa volá, blokuje vykonávajúce vlákno, kým nie je k dispozícii povolenie.

Volá sa získať () bez argumentu je to isté ako volanie s argumentom jeden - pokúsi sa získať jedno povolenie.

5. Získanie povolení s časovým limitom

The RateLimiter API má tiež veľmi užitočné získať () metóda, ktorá prijíma a čas vypršal a TimeUnit ako argumenty.

Volanie tejto metódy, keď nie sú k dispozícii žiadne povolenia, spôsobí, že bude čakať na zadaný čas a potom vyprší časový limit - ak v rámci čas vypršal.

Ak v danom časovom limite nie sú k dispozícii žiadne povolenia, vráti sa nepravdivé. Ak je získať () uspeje, to vracia pravda:

@Test public void givenLimitedResource_when TryAcquire_shouldNotBlockIndefinitely () {// daný RateLimiter rateLimiter = RateLimiter.create (1); // keď rateLimiter.acquire (); boolovsky vysledok = rateLimiter.tryAcquire (2, 10, TimeUnit.MILLISECONDS); // potom assertThat (result) .isFalse (); }

Vytvorili sme a RateLimiter s jedným povolením, takže pokus o získanie dvoch povolení vždy spôsobí tryAcquire () vrátiť sa nepravdivé.

6. Záver

V tomto rýchlom výučbe sme sa pozreli na RateLimiter konštruovať z Guava knižnica.

Naučili sme sa, ako používať RateLimtiter obmedziť počet povolení za sekundu. Videli sme, ako používať jeho blokovacie API, a taktiež sme použili výslovný časový limit na získanie povolenia.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete ako vždy v projekte GitHub - jedná sa o projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found