API asíncrona basada en Tokio. Se conecta a un único servidor, adquiere una clave y la libera de inmediato.
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");Ejemplo que verifica que, aunque varias tareas repitan depósitos/retiros excluyéndose mutuamente mediante un bloqueo por cuenta, el saldo siempre vuelve al valor inicial. TicketBroker se puede clonar (Clone), por lo que se comparte entre varias tareas.
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;
}
};
// Sección crítica segura solo mientras se mantiene el bloqueo
let before = balances[account];
tokio::task::yield_now().await;
balances[account] = before + delta;
// Al descartar (drop) el ticket se libera automáticamente en segundo plano (se puede omitir si no se necesita liberación inmediata)
let (action, sign) = if delta < 0 { ("withdraw", '-') } else { ("deposit", '+') };
tracing::info!("account {account} {action} {sign}${AMOUNT} -> ${}", balances[account]);
}Consulta el ejemplo completo en tests/example_simple.rs, tests/example_bank.rs, tests/bench_test.rs.