接近极限
limitlion的Python项目详细描述
限制
使用redis作为后端的令牌桶速率限制限制。灵感来自 条纹Scaling your API with rate limiters 博客文章。可用于控制从一个进程到多个进程的处理速率。 可能的实现包括保护数据库不受高处理率的影响, 编排队列使用者进程,或强制执行http请求速率限制。
下面是一个名为test
的节流阀的简单示例,它允许5
每秒请求数(rps)
使用8
第二个窗口并请求1
标记的2
突发因子(默认)
对于每个工作单元。在examples
目录中查找更多信息。
redis=redis.Redis('localhost',6379)throttle_configure(redis)whileTrue:allowed,tokens,sleep=throttle('test',5,2,8)ifallowed:print('Do work here')else:print('Sleeping {}'.format(sleep))time.sleep(sleep)
设计
速率限制逻辑使用经典的令牌桶算法,但已实现 完全是一个lua redis脚本。它利用redis TIME 命令,确保所有调用方之间的公平微秒分辨率 打电话的人的钟。注意,桶的开始和结束都是以整秒钟为单位的。
redis 3.2+是必需的,因为replicate_commands()
用于支持使用
lua脚本中的TIME
命令。
配置
RPS、突发系数和窗口大小的默认值提供给节流阀
卢阿剧本。lua脚本创建一个
这些值如果在ReIDIS中还不存在。然后脚本使用这些值
在标记桶计算的knobs
散列中。每次调用还设置
将knobs
键的ttl设置为7天,这样只要
节流阀在上周已经启动。
由于这些设置存储在redis中,因此可以使用单独的进程来调整 它们在飞行中。这可以简单地手动发出redis命令 更改RPS或更复杂的进程,将普罗米修斯度量值轮询为 确定数据库的当前负载并相应地调整rps。