2次发布
0.1.1 | 2019年10月20日 |
---|---|
0.1.0 | 2019年10月20日 |
#896 in 异步
每月192次下载
在2个crate中使用(通过limitation-actix-middlewa…)
40KB
273 行
限制
CI | |
最新版本 | |
文档 | |
crate下载 | |
许可协议 |
目录
使用Redis支持的固定窗口计数器对任意键进行速率限制。
关于
此库为任意键提供由Redis实例支持的固定窗口计数器。周期长度和每个周期的最大限制可以在设置时配置。与后端的通信以非阻塞、异步的方式进行,允许库与Tokio、Actix等其他异步框架配合使用。
注意:当前使用的是预-async/await Futures(即Futures 0.1.x),但随着Rust 1.39.0的发布,这可能在不久的将来升级。
用法
将limitation
添加到您的Cargo.toml
[dependencies]
limitation = "0.1.1"
快速示例
Limiter
的主要类型使用构建器构建自身。构建完成后,使用表示用户、会话、交互等的键的count
方法。请注意,count
是Future,因此必须由运行时驱动完成。例如,要在一个键"10.0.0.5"
上运行一个计数
use limitation::Limiter;
use futures::Future;
// Build a Limiter with a default rate with a local running Redis instance
let limiter = Limiter::build("redis://127.0.0.1/").finish()?;
// The key to count and track
let key = "10.0.0.5";
// Start and run a Tokio runtime to drive the Future to completion
tokio::run(
limiter
// Count returns a Status if the key is under the limit and an `Error::LimitExceeded`
// containing a Status if the limit has been exceeded
.count(key)
// This example deals with both limit exceeded and any Redis connection issues. In this
// case we'll print the error to the standard error stream to show the current limit
// status
.map_err(|err| eprintln!("err: {}", err))
// In this case we are under the limit and can print out the limit status to the
// standard output stream
.and_then(|status| {
println!("ok: {:?}", status);
Ok(())
}),
);
限制构建器
Limiter
的构建器有2个设置,可以根据用例进行自定义
use limitation::Limiter;
use std::time::Duration;
let limiter = Limiter::build("redis://127.0.0.1/")
.limit(5)
.period(Duration::from_secs(10))
.finish()?;
示例
该库的一个简单示例可以在limitation-example中找到。
相关项目和参考
实现的主要灵感来自一篇名为使用NodeJS和Redis构建简单API速率限制器的替代方法的博客文章,作者是Atul R。
为该库使用的其他研究和参考资料
- https://nordicapis.com/everything-you-need-to-know-about-api-rate-limiting/
- https://hechao.li/2018/06/25/Rate-Limiter-Part1/
- https://www.figma.com/blog/an-alternative-approach-to-rate-limiting/
- https://engagor.github.io/blog/2017/05/02/sliding-window-rate-limiter-redis/
想法和未来工作
以下是一些关于本项目的想法和潜在的未来工作。如果你正在阅读此内容,那么你可能对此感兴趣或想帮忙?太好了!请务必查看贡献部分并深入了解!
- 调查并提供替代的速率限制算法,尤其是滑动窗口解决方案。
- 使用
bb8
和bb8-redis
包添加异步Redis连接池,以减少连接建立延迟。 - 在
Limiter
上添加一个status
方法,该方法返回密钥的Status
而无需计数请求。 - 在集成测试套件中添加对
RedisServer
的支持,类似于redis包中的基础设施。
CI状态
构建(master分支)
操作系统 | 稳定的Rust | 夜间Rust | MSRV |
---|---|---|---|
FreeBSD | |||
Linux | |||
macOS | |||
Windows |
测试(master分支)
操作系统 | 稳定的Rust | 夜间Rust | MSRV |
---|---|---|---|
FreeBSD | |||
Linux | |||
macOS | |||
Windows |
检查(master分支)
状态 | |
---|---|
lint | |
格式 |
行为准则
本项目遵循贡献者公约行为准则
。通过参与,你应遵守此准则。如有不适当行为,请联系[email protected]。
问题
如果你对本项目有任何问题或疑问,请通过GitHub问题联系我们。
贡献
欢迎你为新功能、修复或更新做出贡献,无论大小;我们总是很高兴收到拉取请求,并尽最大努力尽快处理。
在你开始编码之前,我们建议通过GitHub问题讨论你的计划,特别是对于更具雄心的贡献。这给其他贡献者一个机会,指明正确的方向,对你的设计提供反馈,并帮助你确定是否有人正在做同样的事情。
发布历史
查看变更日志以获取完整的发布历史。
作者
由Fletcher Nichol ([email protected])创建和维护。
许可协议
在Mozilla公共许可证第2版(LICENSE.txt)下许可。
除非你明确声明,否则任何有意提交以包含在本作品中的贡献(根据MPL-2.0许可证的定义),都应按上述方式许可,不附加任何额外的条款或条件。
依赖关系
~8MB
~162K SLoC