Κοινή χρήση τεχνολογίας

Σημειώσεις εκμάθησης-Χρησιμοποιώντας τον αλγόριθμο Token Bucket του Redis για την εφαρμογή περιορισμού κατανεμημένου ρεύματος

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Πριν εισαγάγουμε τον αλγόριθμο του κάδου, ας παρουσιάσουμε πρώτα τον αλγόριθμο του κάδου με διαρροή (Leaky Bucket)

Αλγόριθμος Leaky Bucket

Ο αλγόριθμος διαρροής κάδου είναι ένα μοντέλο κοντέινερ σταθερής χωρητικότητας που περιορίζει τον ρυθμό μεταφοράς δεδομένων ελέγχοντας την ταχύτητα εισροής και εκροής δεδομένων. Τα κύρια χαρακτηριστικά του αλγόριθμου διαρροής κάδου περιλαμβάνουν:

  • σταθερής χωρητικότητας: Η χωρητικότητα του κάδου με διαρροή έχει διορθωθεί. Μόλις γεμίσει ο κάδος, τα επιπλέον δεδομένα θα απορριφθούν.
  • Συνεχείς διαρροές: Το «νερό» (δεδομένα) στον κάδο συνεχίζει να ρέει έξω με σταθερό ρυθμό.
  • Χειρισμός ριπών: Μπορεί να χειριστεί γρήγορα την κυκλοφορία ριπής όταν ο κάδος δεν είναι γεμάτος, αλλά μόλις ο κάδος γεμίσει, η κυκλοφορία θα είναι περιορισμένη.

Η ίδια η Redisson δεν παρέχει απευθείας υλοποίηση του αλγόριθμου διαρροής κάδου Εάν πρέπει να εφαρμόσετε τον αλγόριθμο διαρροής κάδου στο Redisson, μπορείτε να εξετάσετε τα ακόλουθα βήματα:

  1. Χρησιμοποιήστε ταξινομημένο σύνολο για να αποθηκεύσετε διακριτικά: Χρησιμοποιήστε ταξινομημένο σύνολο για να αποθηκεύσετε διακριτικά στο Redis, κάθε διακριτικό έχει μια χρονική σήμανση ως βαθμολογία.

  2. προσθήκη διακριτικού : Προσθέστε διακριτικά στο ταξινομημένο σύνολο σε σταθερά διαστήματα και η βαθμολογία κάθε διακριτικού είναι η χρονική σήμανση όταν προστίθεται. (Μπορεί να προστεθεί χρησιμοποιώντας προγραμματισμένες εργασίες)

  3. Λάβετε διακριτικό: Όταν χρειάζεται να σταλεί ένα αίτημα, αφαιρέστε (ή αναβάλετε) ένα διακριτικό από το ταξινομημένο σύνολο και ελέγξτε εάν η τρέχουσα ώρα είναι μεγαλύτερη από τη χρονική σήμανση του διακριτικού συν μια μέγιστη επιτρεπόμενη καθυστέρηση.

  4. απόρριψη διακριτικού: Εάν η τρέχουσα ώρα υπερβαίνει τη χρονική σήμανση του διακριτικού συν τη μέγιστη καθυστέρηση, το διακριτικό απορρίπτεται για να προσομοιωθεί η "διαρροή νερού".

  5. Τρέχουσα περιοριστική λογική: Εάν δεν υπάρχουν διαθέσιμα διακριτικά στο ταξινομημένο σύνολο, απορρίψτε το αίτημα ή τοποθετήστε το σε μια ουρά αναμονής.

Αλγόριθμος Token Bucket

Ο αλγόριθμος token bucket είναι ένας πιο ευέλικτος αλγόριθμος ελέγχου ροής που επιτρέπει την αποστολή δεδομένων με συγκεκριμένο ρυθμό δημιουργώντας διακριτικά. Τα κύρια χαρακτηριστικά του αλγόριθμου του κάδου κουπονιών περιλαμβάνουν:

  • Δημιουργία διακριτικών: Δημιουργήστε μάρκες στον κάδο με σταθερό ρυθμό.
  • Χρήση διακριτικών: Τα διακριτικά στον κάδο πρέπει να καταναλώνονται κατά την αποστολή δεδομένων.
  • ξαφνική ικανότητα: Μεγαλύτερη επισκεψιμότητα μπορεί να αποσταλεί όταν επαρκούν τα διακριτικά, μετά την οποία η κίνηση θα περιοριστεί με βάση τον ρυθμό δημιουργίας διακριτικών.

Το πλαίσιο Redisson παρέχει μια συνάρτηση περιορισμού ρεύματος που βασίζεται στον αλγόριθμο του κάδου διακριτικών, η οποία μπορεί να είναι RRateLimiter Υλοποίηση διεπαφής. Το παρακάτω είναι ένα απλό παράδειγμα χρήσης του αλγόριθμου του κάδου διακριτικών στο Redisson:

  1. import org.redisson.api.RRateLimiter;
  2. import org.redisson.api.RedissonClient;
  3. // 假设redissonClient已经创建并配置好连接
  4. RRateLimiter rateLimiter = redissonClient.getRateLimiter("myRateLimiter");
  5. // 配置令牌桶参数
  6. rateLimiter.trySetRate(20, RateType.OVERALL); // 总共可以处理20个请求
  7. rateLimiter.trySetRate(1, RateIntervalUnit.SECONDS); // 每秒生成1个令牌
  8. // 尝试获取一个令牌,如果成功,返回true,否则返回false
  9. boolean acquired = rateLimiter.tryAcquire();
  10. // 使用令牌执行操作
  11. if (acquired) {
  12. // 执行受限操作
  13. } else {
  14. // 处理限流逻辑,例如重试或等待
  15. }
  16. // 关闭Redisson客户端
  17. redissonClient.shutdown();