限流算法详解:令牌桶与漏桶的原理与实践

292 阅读1分钟

限流算法详解:令牌桶与漏桶的原理与实践

1. 限流算法概述

限流是分布式系统中保护服务稳定性的重要手段,常见的限流算法包括令牌桶算法和漏桶算法。本文将详细讲解这两种算法的原理、实现方式,并通过代码示例展示如何在实际项目中应用。

2. 令牌桶算法

原理

令牌桶算法通过固定速率向桶中添加令牌,请求需要获取令牌才能被处理。若桶中没有令牌,则请求被限流。

代码示例(Python)

import time

class TokenBucket:
    def __init__(self, capacity, rate):
        self.capacity = capacity
        self.rate = rate
        self.tokens = capacity
        self.last_time = time.time()

    def consume(self, tokens=1):
        now = time.time()
        elapsed = now - self.last_time
        self.last_time = now
        self.tokens = min(self.capacity, self.tokens + elapsed * self.rate)
        if self.tokens >= tokens:
            self.tokens -= tokens
            return True
        return False

3. 漏桶算法

原理

漏桶算法以固定速率处理请求,超出速率的请求会被缓存或丢弃。

代码示例(Python)

class LeakyBucket:
    def __init__(self, capacity, rate):
        self.capacity = capacity
        self.rate = rate
        self.water = 0
        self.last_time = time.time()

    def consume(self):
        now = time.time()
        elapsed = now - self.last_time
        self.last_time = now
        self.water = max(0, self.water - elapsed * self.rate)
        if self.water < self.capacity:
            self.water += 1
            return True
        return False

4. 应用场景

场景:API限流

假设有一个高并发的API服务,为了防止突发流量压垮系统,可以使用令牌桶算法对请求进行限流。

实现步骤

  1. 初始化令牌桶,设置容量和速率。
  2. 每个请求到达时,尝试获取令牌。
  3. 若获取成功,处理请求;否则返回限流提示。

5. 总结

令牌桶和漏桶算法各有优劣,令牌桶适合处理突发流量,漏桶适合平滑流量。开发者可以根据实际需求选择合适的算法。