Tokio 기반 비동기 API입니다. 서버 하나에 접속해 키를 획득하고 바로 반납합니다.
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 가능해서 여러 태스크에서 공유합니다.
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;
// ticket을 drop하면 백그라운드에서 자동 반납됩니다 (즉시 반납이 필요 없다면 생략 가능)
let (action, sign) = if delta < 0 { ("withdraw", '-') } else { ("deposit", '+') };
tracing::info!("account {account} {action} {sign}${AMOUNT} -> ${}", balances[account]);
}전체 예제는 tests/example_simple.rs, tests/example_bank.rs, tests/bench_test.rs에서 확인하세요.