Ticketing Rust لائبریری
GitHub crates.ioریپوزیٹری
toml
مثال
بنیادی مثال
Application startup پر ایک broker بنا کر share کریں۔ wait=0 queue کے بغیر ایک immediate attempt ہے، زیادہ سے زیادہ 255 سیکنڈ؛ lease 1–250 سیکنڈ۔ آخری minimum-work budget لازم اور 0 ہو سکتا ہے۔ Sub-second اوپر round ہوتے ہیں؛ out-of-range یا normalized lease سے بڑا budget send سے پہلے reject، clamp نہیں۔
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 ticket = broker.acquire(
"key",
Duration::from_secs(5),
Duration::from_secs(30),
Duration::from_secs(2),
).await?;
let token = ticket.token();
// In the same DB transaction: verify/update token high-water and perform the business write.
ticket.release().await?;Automatic close/drop bounded best-effort release ہے۔ Result اہم ہو تو explicit release API استعمال کریں۔ Token کو اسی DB transaction میں protected write fence کرنا لازم ہے۔
جاننے کے قابل رویّہ
- ایک request byte بھی send ہوا ہو سکتا ہے تو final response کھونے کا نتیجہ Indeterminate ہے۔ اسی owner سے
Aauto-resend نہیں؛ caller critical section میں نہیں جاتا۔ - Send سے پہلے cancel unsent؛ possible-send کے بعد session بند۔ ساتھ grant token parse ہو تو bounded compensating exact-token release۔
M، ہرE، malformed/oversized/unknown response session-fatal ہیں۔ Unresolved possible-send acquire Indeterminate۔Bیقینی capacity rejection ہے اور فوراً واپس۔ Internal retry نہیں؛ caller application backoff کے بعد نئے owner سے نیا acquire کر سکتا ہے۔- Explicit/compensating release exact token کو call/enqueue سے مطلق 5 سیکنڈ تک retry کرتا ہے۔
Rsuccess،Nabsent/not current؛ final response نہ ہو تو error، assumed success نہیں۔ - Positive conservative remaining time اور کافی work budget پر ہی Ticket ملتا ہے۔ 250 سیکنڈ سے زیادہ work send سے پہلے unsupported۔
- Token DB fencing لازم: اسی transaction میں
token <= stored_high_waterreject، high-water update اور business write، پھر commit/rollback اور release۔
حفاظتی اختیارات (ٹوکن · TLS)
تمام اختیارات اختیاری ہیں۔ token کو سرور کے client_tokens سے میل کھانا چاہیے، اور TLS کے چار موڈز ہیں: بند / سسٹم ٹرسٹ اسٹور / ایک مخصوص CA / تصدیق چھوڑنا (صرف ٹیسٹ کے لیے)۔
rust
use ticketing::{TicketBroker, TlsMode};
let broker = TicketBroker::builder()
.addrs(["10.0.0.1:5225", "10.0.0.2:5225", "10.0.0.3:5225"])
.token("123")
.tls(TlsMode::SystemRoots)
// .tls(TlsMode::Ca("ca.crt".into()))
// .tls(TlsMode::InsecureSkipVerify)
.connect()?;سرور کی جانب سے ٹوکن، TLS، اور کلسٹر کنفیگریشن آپ Ticketing سرور تعیناتی صفحے پر بنا سکتے ہیں۔