漏桶算法是一种限流算法。漏桶算法的思路很简单,水(请求)先进到漏桶中,漏桶以恒定的速率出水,当水的流入速度过大时会直接溢出。可以看出漏桶算法可以强行限制数据的传输速率。漏桶算法是接口的‘保险丝’,以防止非预期的请求对系统压力过大而引起系统瘫痪,当流量过大时,可以采取拒绝或者引流等机制。
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版权协议,转载请附上原文出处链接和本声明。