使用LeakyBucket算法族的Python速率限制器
pyrate-limiter的Python项目详细描述
^{1}$
嘧啶亚胺
基于漏桶算法的请求速率限制器
简介
此模块可用于对API请求应用速率限制。用户定义窗口持续时间和在此间隔内函数调用的限制。 为了保持Bucket的状态,可以使用MemoryListBucket/MemoryQueueBucket作为内部Bucket。 要在Redis中使用PyrateLimiter,需要安装Redis py。 通过从pyrate扩展AbstractBucket,也可以使用自己的Bucket实现_限位器芯在
可用模块
frompyrate_limiterimport(BucketFullException,Duration,RequestRate,Limiter,MemoryListBucket,MemoryQueueBucket,)
策略
订阅策略
考虑到订阅的常见业务模型的API限制逻辑,我们通常会看到一些类似的策略。在
^{pr2}$- [x]
RequestRate
类是用来描述这种策略的-例如对于上述策略,我们定义了一个速率限制器 如下所示
hourly_rate=RequestRate(500,Duration.HOUR)# maximum 500 requests/hourdaily_rate=RequestRate(1000,Duration.DAY)# maximum 1000 requests/daymonthly_rate=RequestRate(10000,Duration.MONTH)# and so onlimiter=Limiter(hourly_rate,daily_rate,monthly_rate,*other_rates,bucket_class=MemoryListBucket)# default is MemoryQueueBucket# usageidentity=user_id# or ip-address, or maybe bothlimiter.try_acquire(identity)
由于这种逻辑是很自我解释的,请注意,高利率限制必须在低利率之后,即 1000个请求/天必须在小时费率限制之后声明,并且每日限制必须大于每小时限制。在
- 在
[x]
在bucket_class
是保存请求的bucket类型。它可以是内存中的数据结构,如Python List(MemoryListBucket
)或队列MemoryQueueBucket
。在 - 在
[x]对于微服务或去中心化平台,多速率限制器可以共享一个存储空间 请求速率历史记录,即
在Redis
。这个库提供了一个现成的RedisBucket
来处理这种情况,并且是必需的redis-py
作为其对等依赖项。使用上的区别在于使用Redis时,必须提供一个命名prefix
对于每个项目的标识,键可以是不同的。在
fromredisimportConnectionPoolpool=ConnectionPool.from_url('redis://localhost:6379')rate=RequestRate(3,5*Duration.SECOND)bucket_kwargs={"redis_pool":redis_pool,"bucket_name":"my-ultimate-bucket-prefix"}# so each item buckets will have a key name as# my-ultimate-bucket-prefix__item-identitylimiter=Limiter(rate,bucket_class=RedisBucket,bucket_kwargs=bucket_kwargs)item='vutran_item'limiter.try_acquire(item)
- []*RequestRate可能需要按固定的时间表
reset
,例如:每个月的第一天
垃圾邮件保护策略
- [x] 有时,我们需要一个速率限制器来保护我们的API免受垃圾邮件/ddos攻击。一些通常的策略是 跟随
1. No more than 100 requests/minute, or 2. 100 request per minute, and no more than 300 request per hour
节流处理
当收到的请求数超过限制时,我们可以。。在
1. Raise a 429 Http Error, or 2. Keep the incoming requests, waitthen slowly process them one by one.
更复杂的场景
https://www.keycdn.com/support/rate-limiting#types-of-rate-limits
- []*有时,我们可能需要根据时间表/地区或其他指标应用特定的速率限制策略。它
需要在不重新部署整个服务的情况下立即
switch
策略的能力。在
注意事项
标有(*)的Todo项计划用于v3版本。在
- 项目
标签: