menuTicketing

Ticketing کیا ہے؟


ڈسٹری بیوٹڈ لاک کی ضرورت کیوں ہے

جب ایک ہی وسیلے (اکاؤنٹ، آرڈر، انوینٹری، بیچ جابز وغیرہ) کو متعدد پراسیسز یا متعدد سرورز بیک وقت چھیڑتے ہیں تو تصادم پیدا ہوتا ہے۔ زبان میں بلٹ ان میوٹیکس یا سیمافور صرف ایک پراسیس کے اندر کارآمد ہوتے ہیں — اگر پراسیسز متعدد ہوں یا متعدد سرورز میں تقسیم ہوں تو پراسیس کی حد سے آگے کام کرنے والا باہمی اخراج (mutual exclusion) کا ذریعہ الگ سے درکار ہوتا ہے۔

Ticketing بعینہ اسی مسئلے، یعنی پراسیس اور سرور کی حدود سے آگے ڈسٹری بیوٹڈ باہمی اخراج کے لیے ایک لاک سرور اور کلائنٹس کا مجموعہ ہے۔ کلائنٹ TCP کے ذریعے لاک سرور سے جڑ کر ایک نامزد کلید (key) کو حاصل (acquire) کرتا ہے، اور کریٹیکل سیکشن گزرنے کے بعد اسے واپس (release) کر دیتا ہے۔

بنیادی فلسفہ

⚡ ہلکا پھلکا اور تیز رفتار

Ticketing JSON کی بجائے مقررہ چوڑائی کے بائنری فیلڈز سے بنے ایک فریم پروٹوکول کا استعمال کرتا ہے۔ op کے 1 بائٹ سے ڈسپیچ کے بعد op کے حساب سے مقررہ بائٹس کو لمبائی کے طور پر پڑھا جاتا ہے، اور صرف آخری key کو نئی سطر (\n) تک پڑھا جاتا ہے۔ پارسنگ حقیقتاً پارسنگ کے بجائے محض آفسیٹ پڑھنے کے مترادف ہے، جو ہر درخواست پر JSON پارس کرنے کے طریقے سے کم اووَرہیڈ رکھتا ہے۔

🔑 حفاظت فینسنگ ٹوکن کے ذریعے

لاک حاصل کرتے وقت ہر بار سرور ایک یکسانی سے بڑھنے والا u64 فینسنگ ٹوکن بھی ساتھ دیتا ہے۔ اگر محفوظ رکھا جانے والا وسیلہ اس ٹوکن کی یکسانیت (monotonicity) کی تصدیق کرے، تو lease کی میعاد ختم ہونے کے بعد دیر سے بیدار ہونے والا کلائنٹ کم ٹوکن کے ساتھ رسائی کی کوشش کو مسترد کیا جا سکتا ہے۔ اس کے نتیجے میں لاک سرور خود ہر لمحے مکمل طور پر یکساں نہ ہو تب بھی حفاظت برقرار رکھی جا سکتی ہے — یہ خاص طور پر فیل اوور کے دوران اہم ہوتا ہے۔

🔄 بلا تعطل کلسٹر

سرور کا صرف 1 نوڈ ہونے پر بھی کام کرتا ہے (سنگل موڈ)، لیکن اگر بلا تعطل آپریشن درکار ہو تو کم از کم 2 نوڈز سے کلسٹر تشکیل دیا جاتا ہے۔ کلسٹر اتفاق رائے (quorum) کے بجائے ترجیح پر مبنی طریقے سے ایک ایکٹو منتخب کرتا ہے جبکہ باقی نوڈز حقیقی وقت میں ریپلیکیشن وصول کرنے والے اسٹینڈ بائی بن جاتے ہیں۔ اگر ایکٹو ختم ہو جائے (ری اسٹارٹ سمیت) یا مہذب انداز میں بند ہو تو اسٹینڈ بائی اس کی جگہ سنبھال لیتا ہے۔ تفصیلی طریقہ کار کے لیے یہ کیسے کام کرتا ہے صفحہ ملاحظہ کریں۔

🌐 زبان کی کوئی قید نہیں

ایک ہی بائنری پروٹوکول پر 8 زبانوں کے سرکاری کلائنٹس فراہم کیے جاتے ہیں: Rust، Java/Kotlin، JavaScript/TypeScript، Python، C#، Go، Ruby، C/C++۔ ہر زبان کے لیے اس کے ماحولیاتی نظام کے مطابق فطری انداز میں API فراہم کیا جاتا ہے — مثال کے طور پر async/await والی زبانوں میں غیر ہم وقت (asynchronous) طور پر، اور Go/Ruby/C میں بلاکنگ + بیک گراؤنڈ تھریڈ کے ذریعے۔ پروٹوکول ہر زبان میں بائٹ کی سطح پر یکساں ہے۔ ہر زبان کے لیے تنصیب کا طریقہ اور مثالیں لائبریریاں صفحے پر دیکھیں۔