1 个不稳定版本
0.1.3 | 2023年11月1日 |
---|---|
0.1.2 |
|
0.1.1 |
|
0.1.0 |
|
#8 in #described
19KB
176 行
hedged
此软件包提供执行套保请求的功能,灵感来源于"规模化的尾部"中描述的策略。
套保请求通过启动冗余操作并使用第一个完成的结果来帮助减轻分布式系统中的延迟变化。
功能
tokio
: 启用异步支持,包括执行套保请求的Hedge::send
方法。
用法
use std::{
sync::{
atomic::{AtomicU32, Ordering},
Arc,
},
time::Duration,
};
use hedged::Hedge;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let hedge = Hedge::new(7, 64, Duration::from_secs(30), 1, 0.95)?;
let fast_request = || async { "ok" };
let (result, rem) = hedge.send(fast_request).await;
assert!(rem.is_none());
assert_eq!(result, "ok");
let called = Arc::new(AtomicU32::new(0));
let slow_request = {
|| {
called.fetch_add(1, Ordering::SeqCst);
async move {
tokio::time::sleep(Duration::from_millis(500)).await;
"ok"
}
}
};
let (_, rem) = hedge.send(slow_request).await;
// a second request was performed.
assert!(rem.is_some());
assert_eq!(called.load(Ordering::SeqCst), 2);
// Wait for completion in a new task if the request is not cancel-safe.
// For example a connection might need to be returned to a pool for reuse.
if let Some(rem) = rem {
tokio::spawn(rem);
}
Ok(())
}
依赖项
~0.4–2MB
~39K SLoC