menuTicketing
close





Ticketing Rust লাইব্রেরি

GitHub

রিপোজিটরি

উদাহরণ

মৌলিক উদাহরণ

Tokio ভিত্তিক অ্যাসিঙ্ক্রোনাস API। একটি সার্ভারে সংযুক্ত হয়ে একটি কী অর্জন করে সঙ্গে সঙ্গে ফেরত দেওয়া হয়।

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

কনকারেন্সি উদাহরণ (ডিস্ট্রিবিউটেড লক)

একাধিক টাস্ক অ্যাকাউন্ট-ভিত্তিক লক দিয়ে পারস্পরিক বর্জন (mutual exclusion) বজায় রেখে জমা/উত্তোলন বারবার করলেও ব্যালেন্স সবসময় শুরুর মানে ফিরে আসে কিনা যাচাই করার উদাহরণ। 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;

    // 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-এ দেখুন।