Condivisione della tecnologia

Appunti di apprendimento: utilizzo dell'algoritmo del bucket token di Redis per implementare la limitazione della corrente distribuita

2024-07-12

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

Prima di introdurre l’algoritmo del token bucket, introduciamo innanzitutto l’algoritmo del leaky bucket (Leaky Bucket)

Algoritmo Leaky Bucket

L'algoritmo del leaky bucket è un modello di contenitore a capacità fissa che limita la velocità di trasferimento dei dati controllando la velocità di afflusso e deflusso dei dati. Le caratteristiche principali dell'algoritmo del secchio che perde includono:

  • capacità fissa: La capacità del contenitore che perde è fissa. Una volta che il contenitore è pieno, i dati in eccesso verranno scartati o rifiutati.
  • Perdite continue: L'"acqua" (dati) nel secchio continua a defluire a una velocità fissa.
  • Gestione dello scoppio: può gestire rapidamente il traffico burst quando il contenitore non è pieno, ma una volta pieno, il traffico sarà limitato.

Redisson stesso non fornisce direttamente un'implementazione dell'algoritmo del leaky bucket. Se è necessario implementare l'algoritmo del leaky bucket in Redisson, è possibile considerare i seguenti passaggi:

  1. Utilizza il set ordinato per archiviare i token: utilizza il set ordinato per archiviare i token in Redis, ogni token ha un timestamp come punteggio.

  2. aggiungi gettone : aggiungi token al set ordinato a intervalli fissi e il punteggio di ciascun token è il timestamp quando viene aggiunto. (Può essere aggiunto utilizzando le attività pianificate)

  3. Ottieni gettone: quando è necessario inviare una richiesta, rimuovere (o estrarre) un token dal set ordinato e verificare se l'ora corrente è maggiore del timestamp del token più un ritardo massimo consentito.

  4. gettone scartare: Se l'ora corrente supera il timestamp del token più il ritardo massimo, il token viene scartato per simulare la "perdita d'acqua".

  5. Logica di limitazione della corrente: Se non ci sono token disponibili nel set ordinato, rifiuta la richiesta o mettila in coda di attesa.

Algoritmo del token bucket

L'algoritmo del token bucket è un algoritmo di controllo del flusso più flessibile che consente l'invio dei dati a una determinata velocità generando token. Le caratteristiche principali dell'algoritmo del token bucket includono:

  • Generazione di token: genera token nel bucket a una tariffa fissa.
  • Utilizzo dei gettoni: i token nel bucket devono essere consumati durante l'invio dei dati. Se non ci sono abbastanza token, l'invio dei dati verrà ritardato o annullato.
  • capacità improvvisa: è possibile inviare traffico più grande quando i token sono sufficienti, dopodiché il traffico verrà limitato in base alla velocità di generazione dei token.

Il framework Redisson fornisce una funzione di limitazione corrente basata sull'algoritmo del token bucket, che può essere RRateLimiter Implementazione dell'interfaccia. Quello che segue è un semplice esempio di utilizzo dell'algoritmo del token bucket in 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();