5个版本
0.2.2 | 2021年9月8日 |
---|---|
0.2.1 | 2021年9月7日 |
0.2.0 | 2021年9月7日 |
0.1.1 | 2021年9月6日 |
0.1.0 | 2021年9月6日 |
#9 in #limiter
11KB
109 代码行(不包括注释)
r8limit
一个简洁的Rust速率限制库。
用法
在你的Cargo.toml
[dependencies]
r8limit = "0.2"
在你的代码中
use std::time::Duration;
fn main() {
// Allow 3 attempts every 5 seconds
let mut limiter = r8limit::RateLimiter::new(3, Duration::from_secs(5));
println!("{}", limiter.attempt()); // true
println!("{}", limiter.attempt()); // true
println!("{}", limiter.attempt()); // true
println!("{}", limiter.attempt()); // false
}
补充策略
补充策略决定了如何在间隔内补充执行的次数。
全部
默认情况下,补充策略设置为Full
。这意味着每次现在时间和当前窗口开始之间的差异达到或超过指定的间隔时,执行次数就会重置为间隔期间允许的最大执行次数。
use std::time::Duration;
use std::thread::sleep;
use crate::RateLimiter;
fn main() {
let mut limiter = RateLimiter::new(3, Duration::from_secs(1));
limiter.attempt(); // returns true; executions remaining in window: 2
limiter.attempt(); // returns true; executions remaining in window: 1
limiter.attempt(); // returns true; executions remaining in window: 0
limiter.attempt(); // returns false; executions remaining in window: 0
// Remember that the interval is set to 1s
sleep(Duration::from_millis(500)); // executions remaining in window: 0
// As you can see, even though half of the interval has passed, there are still 0 executions available.
assert_eq!(limiter.attempt(), false); // returns false; executions remaining for window: 0
// That is what the default refill policy, RefillPolicy::Full, does.
// We'll sleep for the remainder of the window, which means that the next attempt will reset the window
sleep(Duration::from_millis(500)); // executions remaining in window: 3
limiter.attempt(); // returns true; executions remaining in window: 2
limiter.attempt(); // returns true; executions remaining in window: 1
limiter.attempt(); // returns true; executions remaining in window: 0
limiter.attempt(); // returns false; executions remaining in window: 0
}
渐进
与Full
补充策略不同,Gradual
补充策略不会等到间隔完全过去才补充剩余的执行次数。
use std::time::Duration;
use std::thread::sleep;
use crate::{RateLimiter, RefillPolicy};
fn main() {
let mut limiter = RateLimiter::new(2, Duration::from_millis(500)).with_refill_policy(RefillPolicy::Gradual);
limiter.attempt(); // returns true; executions remaining in window: 1
limiter.attempt(); // returns true; executions remaining in window: 0
limiter.attempt(); // returns false; executions remaining in window: 0
// The Gradual refill policy calculates the percentage of the interval which has
// elapsed, and multiplies that by the number of executions allowed per interval.
// This means that if we wait for half of the interval, half of the executions will become available again
sleep(Duration::from_millis(250)); // executions remaining in window: 1
limiter.attempt(); // returns true; executions remaining in window: 0
limiter.attempt(); // returns false; executions remaining in window: 0
sleep(Duration::from_millis(500)); // executions remaining in window: 2
limiter.attempt(); // returns true; executions remaining in window: 1
limiter.attempt(); // returns true; executions remaining in window: 0
limiter.attempt(); // returns false; executions remaining in window: 0
}