menuTicketing

Ticketing Rust 库

GitHub

代码仓库

示例

基础示例

这是基于 Tokio 的异步 API。连接到一台服务器后获取 key,并立即释放。

rust
use std::time::Duration;
use ticketing::TicketBroker;

let broker = TicketBroker::connect(["127.0.0.1:5225"]);
broker.wait_ready(Duration::from_secs(5)).await;

let wait = Duration::from_secs(5);
let lease = Duration::from_secs(30);

let ticket = broker.acquire("key", wait, lease).await.unwrap();
ticket.release().await.unwrap();

println!("pass");

并发示例(分布式锁)

这是一个验证示例:多个任务通过账户级锁互斥地反复存取款,确认余额最终总能回到初始值。 TicketBroker 可以 Clone,因此可以在多个任务间共享。

rust
async fn transaction(broker: &TicketBroker, account: usize, delta: i64) {
    let key = format!("account-{account}");

    let _ticket = match broker.acquire(&key, WAIT, LEASE).await {
        Ok(ticket) => Some(ticket),
        Err(e) => {
            tracing::error!("account {account} acquire failed: {e}");
            return;
        }
    };

    // 仅在持有锁期间的临界区是安全的
    let before = balances[account];
    tokio::task::yield_now().await;
    balances[account] = before + delta;

    // drop ticket 时会在后台自动释放(若无需立即释放则可省略)
    let (action, sign) = if delta < 0 { ("withdraw", '-') } else { ("deposit", '+') };
    tracing::info!("account {account} {action} {sign}${AMOUNT} -> ${}", balances[account]);
}

完整示例请参阅 tests/example_simple.rstests/example_bank.rstests/bench_test.rs