מדריך מהיר למדרג הגויאבה

1. סקירה כללית

במאמר זה נבחן את ה- RateLimiter כיתה מה גויאבה סִפְרִיָה.

ה RateLimiter class הוא מבנה המאפשר לנו לווסת את קצב העיבוד כלשהו. אם ניצור א RateLimiter עם היתרי N - המשמעות היא שתהליך יכול להוציא לכל היותר אישורי N בשנייה.

2. תלות של Maven

נשתמש בספריית גויאבה:

 com.google.guava גויאבה 29.0-jre 

הגרסה האחרונה תוכל למצוא כאן.

3. יצירה ושימוש RateLimiter

בואו נגיד שאנחנו רוצים להגביל את קצב הביצוע של doSomeLimitedOperation () עד 2 פעמים בשנייה.

אנחנו יכולים ליצור RateLimiter למשל באמצעות שלה לִיצוֹר() שיטת מפעל:

RateLimiter rateLimiter = RateLimiter.create (2);

לאחר מכן, על מנת לקבל היתר ביצוע מה- RateLimiter, אנחנו צריכים להתקשר ל לִרְכּוֹשׁ() שיטה:

rateLimiter.acquire (1);

על מנת לבדוק את זה עובד, נבצע 2 שיחות עוקבות לשיטה המצערת:

זמן התחלה ארוך = ZonedDateTime.now (). getSecond (); rateLimiter.acquire (1); doSomeLimitedOperation (); rateLimiter.acquire (1); doSomeLimitedOperation (); long elapsedTimeSeconds = ZonedDateTime.now (). getSecond () - startTime;

כדי לפשט את הבדיקה שלנו, נניח doSomeLimitedOperation () השיטה מסתיימת באופן מיידי.

במקרה כזה, שתי הקריאות של לִרְכּוֹשׁ() השיטה לא אמורה לחסום והזמן שחלף צריך להיות פחות או מתחת לשנייה - מכיוון שניתן להשיג את שני האישורים באופן מיידי:

assertThat (elapsedTimeSeconds <= 1);

בנוסף, אנו יכולים לרכוש את כל האישורים באחד לִרְכּוֹשׁ() שִׂיחָה:

@Test הציבור בטל givenLimitedResource_whenRequestOnce_thenShouldPermitWithoutBlocking () {// נתון RateLimiter rateLimiter = RateLimiter.create (100); // כאשר זמן התחלה ארוך = ZonedDateTime.now (). getSecond (); rateLimiter.acquire (100); doSomeLimitedOperation (); long elapsedTimeSeconds = ZonedDateTime.now (). getSecond () - startTime; // ואז assertThat (elapsedTimeSeconds <= 1); }

זה יכול להיות שימושי אם, למשל, אנחנו צריכים לשלוח 100 בתים לשנייה. אנחנו יכולים לשלוח מאה פעם בייט אחד שרוכש אישור אחד בכל פעם. מצד שני, אנו יכולים לשלוח את כל 100 הבתים בו זמנית לרכוש את כל 100 האישורים בפעולה אחת.

4. רכישת אישורים בצורה חוסמת

הבה נבחן דוגמה מעט מורכבת יותר.

ניצור a RateLimiter עם 100 אישורים. ואז נבצע פעולה שצריכה לרכוש 1000 אישורים. על פי המפרט של RateLimiter, פעולה כזו תצטרך לפחות 10 שניות כדי להשלים מכיוון שנוכל לבצע רק 100 יחידות פעולה בשנייה:

@Test הציבור בטל givenLimitedResource_whenUseRateLimiter_thenShouldLimitPermits () {// נתון RateLimiter rateLimiter = RateLimiter.create (100); // כאשר זמן התחלה ארוך = ZonedDateTime.now (). getSecond (); IntStream.range (0, 1000) .forEach (i -> {rateLimiter.acquire (); doSomeLimitedOperation ();}); long elapsedTimeSeconds = ZonedDateTime.now (). getSecond () - startTime; // ואז assertThat (elapsedTimeSeconds> = 10); }

שים לב, כיצד אנו משתמשים ב- לִרְכּוֹשׁ() שיטה כאן - זו שיטת חסימה ועלינו להיות זהירים בעת השימוש בה. כאשר לִרְכּוֹשׁ() כאשר השיטה נקראת, היא חוסמת את שרשור הביצוע עד לקבלת היתר.

קורא ל לִרְכּוֹשׁ() ללא ויכוח זהה לקרוא לזה עם אחד כוויכוח - היא תנסה לרכוש היתר אחד.

5. רכישת אישורים עם פסק זמן

ה RateLimiter API יש גם שימושי מאוד לִרְכּוֹשׁ() שיטה ש מקבל א פסק זמן ו TimeUnit כטיעונים.

קריאה לשיטה זו כשאין אישורים זמינים תגרום לה להמתין לזמן מוגדר ואז לפסק זמן - אם אין מספיק אישורים זמינים במסגרת פסק זמן.

כשאין אישורים זמינים במסגרת פסק הזמן הנתון, הוא חוזר שֶׁקֶר. אם לִרְכּוֹשׁ() מצליח, זה החזרות נָכוֹן:

@Test הציבור בטל givenLimitedResource_whenTryAcquire_shouldNotBlockIndefinitely () {// נתון RateLimiter rateLimiter = RateLimiter.create (1); // כאשר rateLimiter.acquire (); תוצאה בוליאנית = rateLimiter.tryAcquire (2, 10, TimeUnit.MILLISECONDS); // ואז טוענים כי (תוצאה) .isFalse (); }

יצרנו א RateLimiter בהיתר אחד ולכן ניסיון לרכוש שני אישורים תמיד יגרום tryAcquire () לחזור שֶׁקֶר.

6. מסקנה

במדריך מהיר זה, הסתכלנו על RateLimiter לבנות מתוך גויאבה סִפְרִיָה.

למדנו כיצד להשתמש ב- RateLimtiter להגבלת מספר האישורים לשנייה. ראינו כיצד להשתמש בממשק ה- API החוסם שלו והשתמשנו גם בפסק זמן מפורש לרכישת ההיתר.

כמו תמיד, ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד בפרויקט GitHub - זהו פרויקט של Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


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