漏桶算法

漏桶算法是一种限流算法。漏桶算法的思路很简单,水(请求)先进到漏桶中,漏桶以恒定的速率出水,当水的流入速度过大时会直接溢出。可以看出漏桶算法可以强行限制数据的传输速率。漏桶算法是接口的‘保险丝’,以防止非预期的请求对系统压力过大而引起系统瘫痪,当流量过大时,可以采取拒绝或者引流等机制。

Python实现:

from datetime import datetime,timedelta
class Bucket(object):
    def __init__(self,period):
        self.period_delta = timedelta(seconds=period)
        self.reset_time = datetime.now()
        self.max_quota = 0
        self.quota_consumed = 0

    def __repr__(self):
        return ('Bucket(max_quota=%d,quota_consumed=%d)'%
                (self.max_quota,self.quota_consumed))

    @property
    def quota(self):
        return self.max_quota - self.quota_consumed

    @quota.setter
    def quota(self,amount):
        delta = self.max_quota - amount
        if amount ==0:
            self.quota_consumed = 0
            self.max_quota = 0
        elif delta < 0:
            assert self.quota_consumed == 0
            self.max_quota = amount
        else:
            assert self.max_quota >= self.quota_consumed
            self.quota_consumed += delta


def fill(bucket,amount):
    now = datetime.now()
    if now - bucket.reset_time > bucket.period_delta:
        bucket.quota = 0
        bucket.reset_time = datetime.now()
    bucket.quota += amount

def deduct(bucket,amount):
    now = datetime.now()
    if now - bucket.reset_time > bucket.period_delta:
        return False
    elif bucket.quota - amount < 0:
        return False
    bucket.quota -= amount
    return True
if __name__ == '__main__':
    bucket = Bucket(60)
    fill(bucket,100)
    if deduct(bucket,90):
        print('had 99 quota')
    else:
        print('Not enough for 99 quota')







版权声明:本文为weixin_41741568原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。