Compartilhamento de tecnologia

Notas de aprendizagem - usando o algoritmo de token bucket do Redis para implementar a limitação de corrente distribuída

2024-07-12

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

Antes de apresentar o algoritmo de token bucket, vamos primeiro apresentar o algoritmo de bucket vazado (Leaky Bucket)

Algoritmo de balde furado

O algoritmo Leaky Bucket é um modelo de contêiner de capacidade fixa que limita a taxa de transferência de dados controlando a velocidade de entrada e saída de dados. Os principais recursos do algoritmo de balde furado incluem:

  • capacidade fixa: A capacidade do balde com vazamento é fixada quando o balde estiver cheio, os dados em excesso serão descartados ou rejeitados.
  • Vazamentos contínuos: A "água" (dados) no balde continua a fluir a uma taxa fixa.
  • Tratamento de explosão: pode lidar rapidamente com o tráfego intermitente quando o bucket não estiver cheio, mas quando o bucket estiver cheio, o tráfego será limitado.

O próprio Redisson não fornece diretamente uma implementação do algoritmo de balde furado. Se você precisar implementar o algoritmo de balde furado no Redisson, poderá considerar as seguintes etapas:

  1. Use conjunto classificado para armazenar tokens: Use um conjunto classificado para armazenar tokens no Redis, cada token tem um carimbo de data/hora como pontuação.

  2. adicionar token : Adicione tokens ao conjunto classificado em intervalos fixos, e a pontuação de cada token será o carimbo de data/hora quando adicionado. (Pode ser adicionado usando tarefas agendadas)

  3. Obter token: quando uma solicitação precisa ser enviada, remova (ou pop) um token do conjunto classificado e verifique se o horário atual é maior que o carimbo de data/hora do token mais um atraso máximo permitido.

  4. descartar token: Se o tempo atual ultrapassar o timestamp do token mais o atraso máximo, o token é descartado para simular “vazamento de água”.

  5. Lógica de limitação de corrente: Se não houver tokens disponíveis no conjunto classificado, rejeite a solicitação ou coloque-a em uma fila de espera.

Algoritmo de balde de token

O algoritmo token bucket é um algoritmo de controle de fluxo mais flexível que permite que os dados sejam enviados a uma determinada taxa, gerando tokens. Os principais recursos do algoritmo de token bucket incluem:

  • Geração de token: Gere tokens no bucket a uma taxa fixa.
  • Uso de token: Os tokens no bucket precisam ser consumidos ao enviar dados. Se não houver tokens suficientes, o envio de dados será atrasado ou descartado.
  • habilidade repentina: tráfego maior pode ser enviado quando os tokens forem suficientes, após o que o tráfego será limitado com base na taxa de geração de tokens.

A estrutura Redisson fornece uma função de limitação de corrente baseada no algoritmo de token bucket, que pode ser RRateLimiter Implementação de interface. A seguir está um exemplo simples de uso do algoritmo de token bucket no 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();