#distributed #async #requests #described #scale #tail #hedge

hedged

按照“规模化的尾部”论文中所述实现“套保请求”

1 个不稳定版本

0.1.3 2023年11月1日
0.1.2 2023年11月1日
0.1.1 2023年11月1日
0.1.0 2023年11月1日

#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