menuTicketing
close





Ticketing क्या है?


डिस्ट्रिब्यूटेड लॉक की आवश्यकता क्यों है

जब कई प्रोसेस या कई सर्वर एक ही संसाधन (खाता, ऑर्डर, इन्वेंटरी, बैच जॉब आदि) को एक साथ छूते हैं, तो प्रतिस्पर्धा (contention) पैदा होती है। भाषा में अंतर्निहित म्यूटेक्स या सेमाफ़ोर केवल एक प्रोसेस के भीतर ही मान्य होते हैं — यदि प्रोसेस कई हों या कई सर्वर में बँटे हों, तो प्रोसेस की सीमा के पार जाने वाला अन्योन्य बहिष्करण (mutual exclusion) साधन अलग से चाहिए होता है।

Ticketing ठीक इसी समस्या — यानी प्रोसेस और सर्वर की सीमाओं के पार जाने वाले डिस्ट्रिब्यूटेड म्यूचुअल एक्सक्लूज़न — के लिए बना एक लॉक सर्वर और क्लाइंट का संग्रह है। क्लाइंट TCP के ज़रिए लॉक सर्वर से जुड़कर नाम वाली key को अधिग्रहीत (acquire) करता है, क्रिटिकल सेक्शन पार करने के बाद रिलीज़ (release) करता है।

मूल दर्शन

⚡ हल्का और तेज़

Ticketing JSON के बजाय स्थिर-चौड़ाई वाली बाइनरी फ़ील्ड्स से बना फ़्रेम प्रोटोकॉल इस्तेमाल करता है। op 1 बाइट डिस्पैच के बाद op के अनुसार निश्चित बाइट्स लंबाई में पढ़े जाते हैं, और केवल अंतिम key ही न्यूलाइन (\n) तक पढ़ी जाती है। पार्सिंग वास्तव में पार्सिंग कहलाने के बजाय ऑफ़सेट पढ़ने के करीब है, जिससे हर रिक्वेस्ट पर JSON पार्स करने की तुलना में ओवरहेड कम रहता है।

🔑 सुरक्षा फेंसिंग टोकन से

जब भी लॉक अधिग्रहीत किया जाता है, सर्वर उसके साथ एक मोनोटोनिक रूप से बढ़ने वाला u64 फेंसिंग टोकन भी देता है। यदि संरक्षित संसाधन इस टोकन की मोनोटोनिसिटी को सत्यापित करे, तो lease समाप्त होने के बाद देर से जागने वाला क्लाइंट कम टोकन के साथ पहुँच से अस्वीकृत किया जा सकता है। इसके परिणामस्वरूप लॉक सर्वर स्वयं हर पल पूरी तरह से संगत न होने पर भी सुरक्षा बनाए रखी जा सकती है — यह विशेष रूप से फ़ेलओवर के दौरान महत्वपूर्ण है।

🔄 निर्बाध क्लस्टर

एक ही सर्वर से भी काम चलता है (सिंगल मोड), लेकिन निर्बाध संचालन चाहिए तो कम से कम 2 सर्वर से क्लस्टर बनाया जाता है। क्लस्टर सहमति (कोरम) के बजाय प्राथमिकता-आधारित तरीके से एक एक्टिव चुनता है और बाकी उसकी स्थिति की रीयल-टाइम रेप्लिकेशन पाने वाले स्टैंडबाय बन जाते हैं। यदि एक्टिव मर जाए (रीस्टार्ट सहित) या ग्रेसफुल तरीके से बंद हो, तो स्टैंडबाय आगे बढ़कर संभाल लेता है। विस्तृत व्यवहार के लिए यह कैसे काम करता है पेज देखें।

🌐 भाषा की कोई सीमा नहीं

एक ही बाइनरी प्रोटोकॉल पर 8 भाषाओं में आधिकारिक क्लाइंट उपलब्ध हैं: Rust, Java/Kotlin, JavaScript/TypeScript, Python, C#, Go, Ruby, C/C++. हर भाषा में उस भाषा के इकोसिस्टम के लिए स्वाभाविक तरीके से API उजागर किया जाता है — उदाहरण के लिए async/await श्रेणी की भाषाओं में असिंक्रोनस, Go/Ruby/C में ब्लॉकिंग + बैकग्राउंड थ्रेड के साथ। प्रोटोकॉल सभी भाषाओं में बाइट-दर-बाइट समान है। भाषा-वार इंस्टॉलेशन और उदाहरण लाइब्रेरीज़ पेज पर देखें।