pub trait ThrottleStore: Send + Sync {
// Required methods
fn record_failure(
&self,
key: &str,
now: u64,
window_secs: u64,
) -> Result<u32, StoreError>;
fn failure_count(
&self,
key: &str,
now: u64,
window_secs: u64,
) -> Result<u32, StoreError>;
fn is_banned(&self, key: &str, now: u64) -> Result<Option<u64>, StoreError>;
fn ban(&self, key: &str, until: u64) -> Result<(), StoreError>;
fn clear_failures(&self, key: &str) -> Result<(), StoreError>;
fn reset(&self, key: &str) -> Result<(), StoreError>;
fn purge_expired(&self, now: u64) -> Result<usize, StoreError>;
}Expand description
限流状态后端。
所有 now 均为 unix 秒,调用方须保证单调不减(系统时钟正常满足):
滑动窗口靠比较时间戳,时间倒流会让新记录被当成过期数据丢掉。
Required Methods§
Sourcefn record_failure(
&self,
key: &str,
now: u64,
window_secs: u64,
) -> Result<u32, StoreError>
fn record_failure( &self, key: &str, now: u64, window_secs: u64, ) -> Result<u32, StoreError>
记录一次失败,返回窗口内的累计失败数(含本次)。
实现须自行滑动窗口:只计 now - window_secs 之后的失败。
Sourcefn failure_count(
&self,
key: &str,
now: u64,
window_secs: u64,
) -> Result<u32, StoreError>
fn failure_count( &self, key: &str, now: u64, window_secs: u64, ) -> Result<u32, StoreError>
只读查询窗口内失败数,不写入任何状态。
供 Throttle::check 在放行时算剩余额度 —— 没有它,请求路径只能返回一个
乐观的满额数字(remaining 会被写进 X-RateLimit 响应头,谎报等于误导调用方)。
Sourcefn is_banned(&self, key: &str, now: u64) -> Result<Option<u64>, StoreError>
fn is_banned(&self, key: &str, now: u64) -> Result<Option<u64>, StoreError>
该 key 是否处于封禁中;是则返回解封时刻。
返回未过滤的原始值也是合法的:Throttle::check 会自己拿 now 比对
until 再决定是否 Banned,后端不必代劳(返回 Some(until) 且
until <= now 不会被当成永久封禁)。
Sourcefn ban(&self, key: &str, until: u64) -> Result<(), StoreError>
fn ban(&self, key: &str, until: u64) -> Result<(), StoreError>
写入封禁截止时刻。只能延长不能缩短:已生效的封禁遇上更早的 until
应被忽略(时钟回拨时 now + ban_secs 可能反而更小)。
Sourcefn clear_failures(&self, key: &str) -> Result<(), StoreError>
fn clear_failures(&self, key: &str) -> Result<(), StoreError>
只清空失败计数,保留封禁。
认证成功走这里,人工解封走 reset:二者合并会让共享桶(如 ip:)的封禁
被桶里任意另一个人一次成功认证解除。
Sourcefn purge_expired(&self, now: u64) -> Result<usize, StoreError>
fn purge_expired(&self, now: u64) -> Result<usize, StoreError>
清除已过期状态,返回清除条数。
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".