menuTicketing

Biblioteca Ticketing para Rust

GitHub

Repositorio

Ejemplo

Ejemplo básico

API asíncrona basada en Tokio. Se conecta a un único servidor, adquiere una clave y la libera de inmediato.

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");

Ejemplo de concurrencia (bloqueo distribuido)

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.

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;
        }
    };

    // 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.