Skip to main content

ThrottleStore

Trait ThrottleStore 

Source
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§

Source

fn record_failure( &self, key: &str, now: u64, window_secs: u64, ) -> Result<u32, StoreError>

记录一次失败,返回窗口内的累计失败数(含本次)。 实现须自行滑动窗口:只计 now - window_secs 之后的失败。

Source

fn failure_count( &self, key: &str, now: u64, window_secs: u64, ) -> Result<u32, StoreError>

只读查询窗口内失败数,不写入任何状态。

供 Throttle::check 在放行时算剩余额度 —— 没有它,请求路径只能返回一个 乐观的满额数字(remaining 会被写进 X-RateLimit 响应头,谎报等于误导调用方)。

Source

fn is_banned(&self, key: &str, now: u64) -> Result<Option<u64>, StoreError>

该 key 是否处于封禁中;是则返回解封时刻。

返回未过滤的原始值也是合法的:Throttle::check 会自己拿 now 比对 until 再决定是否 Banned,后端不必代劳(返回 Some(until) 且 until <= now 不会被当成永久封禁)。

Source

fn ban(&self, key: &str, until: u64) -> Result<(), StoreError>

写入封禁截止时刻。只能延长不能缩短:已生效的封禁遇上更早的 until 应被忽略(时钟回拨时 now + ban_secs 可能反而更小)。

Source

fn clear_failures(&self, key: &str) -> Result<(), StoreError>

只清空失败计数,保留封禁。

认证成功走这里,人工解封走 reset:二者合并会让共享桶(如 ip:)的封禁 被桶里任意另一个人一次成功认证解除。

Source

fn reset(&self, key: &str) -> Result<(), StoreError>

清零该 key 的失败计数与封禁。

Source

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".

Implementors§