【发布时间】:2023-01-14 09:15:40
【问题描述】:
我正在尝试使用 Governor crate 限制速率以与 Warp 一起使用。但是,当我尝试使用包裹在闭包的 Arc 部分中的 rate_limiter 实例时,我不断收到“期望闭包实现 Fn 特性,但此闭包仅实现 FnOnce”
我尝试在闭包内外克隆 rate_limiter 实例,但它仍然抱怨。有人可以帮我解决这个问题吗?
use crate::rejections::RateLimitFailure;
use dashmap::DashMap;
use governor::{
clock::{QuantaClock, QuantaInstant},
middleware::NoOpMiddleware,
state::InMemoryState,
Quota, RateLimiter,
};
use nonzero_ext::nonzero;
use std::collections::hash_map::RandomState;
use std::sync::Arc;
use warp::{Filter, Rejection};
const LIMIT: u32 = 50;
#[derive(Debug, Clone)]
pub struct FridayRateLimiter<'a> {
pub lim: Arc<
RateLimiter<
&'a str,
DashMap<&'a str, InMemoryState, RandomState>,
QuantaClock,
NoOpMiddleware<QuantaInstant>,
>,
>,
}
impl<'a> FridayRateLimiter<'a> {
pub fn new() -> Self {
let lim = Arc::new(RateLimiter::keyed(Quota::per_second(nonzero!(LIMIT))));
FridayRateLimiter { lim }
}
}
pub fn with_rate_limiter(
rate_limiter: FridayRateLimiter,
) -> impl Filter<Extract = (bool,), Error = Rejection> + Clone {
let addr = warp::header::<String>("HTTP_X_FORWARDED_FOR");
let rate_limiter = rate_limiter.clone();
addr.and_then(|ip: String| async move {
let rate_limiter = rate_limiter.clone();
if rate_limiter.lim.check_key(&ip.as_str()).is_err() {
return Err(warp::reject::custom(RateLimitFailure));
}
Ok(true)
})
}
【问题讨论】:
-
你能发布一个编译器输出吗?