使用LeakyBucket算法族的Python速率限制器

pyrate-limiter的Python项目详细描述


^{1}$

嘧啶亚胺

基于漏桶算法的请求速率限制器

PyPI versionCoverage StatusPython 3.7Python 3.8MaintenancePyPI licenseHitCount


简介

此模块可用于对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版本。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么这个循环打印1020之间的所有值?我想让它打印出可以被5整除的值   java如何在JTable中集中单元格   java无法通过一个键从hashmap获取对象,该键具有相同的hashcode,并且两个键等于()   不兼容的类型?JAVA   将字符串开头与空格匹配时java replaceAll的正则表达式混淆结果   java为非java应用程序创建jar文件。类文件   java无法从另一个普通Http Servlet访问筛选器Servlet的会话属性   java Ejb,第二个方法中的错误回滚第一个方法   swing java操作侦听器在菜单上,而不是在菜单项上   分析文件时出错:分析文件时出错:无法在Java的XSSF中分析excel文件   java将实体注入到ViewScope Bean中   java如何关闭终端而不终止正在运行的jar文件进程   爪哇力下传   java不能隐式地将[T]强制转换为AT,其中[T]扩展为AT   java Spring项目在jsp页面中显示mysql表数据   java在创建新实例SQLITE时出错