क्या केवल आशावादी संगरोध नियंत्रण तक ही सीमित है?


9

प्रसंग

रेस्ट आर्किटेक्चरल स्टाइल के वैधानिकता के कारण जिसमें प्रत्येक अनुरोध पूरी तरह से अकेला होता है, अग्रणी सर्वर कभी भी क्लाइंट के बारे में कोई भी जानकारी संग्रहीत नहीं करता है।

इस प्रकार, निराशावादी संगामिति नियंत्रण उपयुक्त नहीं है क्योंकि इसके लिए उस सर्वर स्टोर की आवश्यकता होती है जो क्लाइंट को संसाधन पर लॉक मिलता है। आशावादी समवर्ती नियंत्रण का उपयोग तब Etagहेडर की सहायता से किया जाता है । (btw, जैसा कि मैंने वहां पूछा /programming/30080634/concurrency-in-a-rest-api )

मुसीबत

एक आशावादी संगोष्ठी नियंत्रण तंत्र के साथ मुख्य समस्या यह है कि आप किसी भी ऑपरेशन को करने के लिए हर समय, सभी ग्राहकों को अनुमति देते हैं।

और मैं इससे बचना चाहूंगा कि REST के आधारहीनता सिद्धांत को तोड़े बिना। मेरा मतलब है कि सभी क्लाइंट किसी भी समय कोई भी ऑपरेशन नहीं कर सकते हैं।

सवाल

मेरे दिमाग में, यह एक अर्ध-आशावादी संगामिति नियंत्रण तंत्र के साथ संभव होगा , जैसे:

  • ग्राहक टोकन के लिए अनुरोध कर सकते हैं
  • केवल एक टोकन उत्पन्न किया जा सकता है और इसकी वैधता की सीमित अवधि होती है
  • संसाधनों (जैसे POST या PUT ) पर संचालन करने के लिए , क्लाइंट को अनुरोध के मुख्य भाग (या हेडर?) के हिस्से के रूप में यह टोकन देना होगा। जिस ग्राहक के पास टोकन नहीं है, वह इन कार्यों को नहीं कर सकता है।

यह आशावादी समवर्ती नियंत्रण के समान है, सिवाय इसके कि केवल एक ग्राहक कुछ ऑपरेशन कर सकता है (एक जो टोकन मिला है) ... "सभी क्लाइंट सभी ऑपरेशन कर सकते हैं" के विपरीत।

क्या यह तंत्र REST वास्तु शैली के अनुकूल है? क्या यह उसके किसी अवरोध को तोड़ता है? मैं SO पर पूछने के लिए सोच रहा था, लेकिन यह एक उच्च स्तरीय प्रश्न लगता है, जो सॉफ्टवेयर डिजाइन से संबंधित है।


1
यह वास्तव में सरल है, लेकिन आपको Transactionएक संसाधन के रूप में स्पष्ट रूप से मॉडल करना होगा ।
जोर्ग डब्ल्यू मित्तग

यह क्या बदलता है? आपकी टिप्पणी समझने के लिए निश्चित नहीं है। मैं लेन-देन के लिए संगामिति नियंत्रण नहीं कर रहा हूं, बल्कि ग्राहक को "अब ठीक है, यह कहने के लिए, आपको पूरा यकीन है कि कोई भी संसाधन नहीं बदलेगा" (जैसा कि इसे एक अद्वितीय टोकन मिला है)।
अनीलुरसफुलेंस

1
अंतर क्या है? एक तरफ, आप जांच करने के लिए ईटैग का उपयोग करते हैं, जिसे "वर्तमान" संस्करण को अपडेट करने की अनुमति है; यदि यह बंद हो जाता है, तो आपको अपना संस्करण अपडेट करना होगा और उसके बाद अपडेट करना होगा। दूसरी तरफ, आपके पास अपना "लॉकिंग" तंत्र है: एक को अनुमति है, दूसरों को इंतजार करना होगा। बहुत अच्छा लगता है। दूसरे दृष्टिकोण के लिए नकारात्मक: 2 अनुरोध - लॉक के लिए 1 और अपडेट के लिए 1। एक इष्टतम मामले में, आपके पास Etag-approach के माध्यम से केवल एक अपडेट है।
थॉमस

खैर, आम तौर पर संगामिति नियंत्रण के बारे में बोलते हुए ... दूसरा जो "रेस हार गया" उसे हमेशा इंतजार करना होगा (बस अलग-अलग कारणों से, मैं उससे सहमत हूं)। के साथ अंतर Etag? आपके साथ Etagयह निश्चित नहीं है कि आपके ऑपरेशन पूरे हो जाएंगे, आपके पास ऐसी स्थिति हो सकती है जहां आप कभी भी कोई ऑपरेशन नहीं करेंगे। एक लॉक के साथ, आप कम से कम अपना ऑपरेशन करने के लिए सुनिश्चित हैं। इसलिए एक साधारण ताला एक ऐसे वातावरण के बीच का एक मध्य है जहां "उच्च संघर्ष" और "दुर्लभ संघर्ष" हो सकते हैं।
अनिलुरसफुलेंस 15

जवाबों:


3

आपको उपयोगकर्ता के इंटरैक्शन के लिए प्रतीक्षा करते समय कभी भी (जैसा कभी नहीं होगा) कभी भी किसी भी संसाधन को लॉक नहीं करना चाहिए।

कुछ बिंदु पर आपके कुछ उपयोगकर्ता लंबे सप्ताहांत के लिए कुछ महत्वपूर्ण रिकॉर्ड बंद कर देंगे।

आह, लेकिन आप ऐसा नहीं होने देंगे क्योंकि आपके पास कुछ चालाक समय है / गतिरोध समाधान योजना; तब कुछ बिंदु पर यह बहुत गलत हो जाएगा और एक उपयोगकर्ता जो एक अच्छा "आपके विजेट का आदेश दिया गया है" संदेश मदद डेस्क पर चिल्ला रहा होगा यह जानने की मांग कर रहा है कि उसका विजेट क्यों वितरित नहीं किया गया था।

अधिकांश लोग "क्षमा करें दूसरे उपयोगकर्ता ने केवल इस भाग को आदेश दिया है" संदेश से निपट सकते हैं।


आपने इसे अच्छी तरह से समझाया। हालाँकि मैं आपके पहले वाक्य से पूरी तरह आश्वस्त नहीं हूँ: कुछ बिंदु पर आप गारंटी देंगे कि आपके अलावा कोई भी व्यक्ति आदेश नहीं दे सकता है। लेकिन ठीक है, आपका अंतिम वाक्य एक अच्छा सारांश है, 99% समय में यह मामला है।
अनिलुरसफुलगेन्स

1
यदि आपको किसी विशेष उपयोगकर्ता के लिए रिकॉर्ड लॉक करने की आवश्यकता है, तो इसे एप्लिकेशन स्तर पर करें। या तो एक सरल "LockedBy" विशेषता होगी, या, कुछ अधिक परिष्कृत संस्करण और वर्कफ़्लो तंत्र के साथ।
जेम्स एंडरसन

"आवेदन स्तर पर" से आपका क्या तात्पर्य है? यदि आप अपने संसाधन पर "LockedBy" विशेषता जोड़ते हैं, तो आप अपने सर्वर पर क्लाइंट के बारे में जानकारी संग्रहीत करते हैं। या शायद मैं आपकी टिप्पणी को समझ नहीं पाया। यदि आप कुछ विवरण प्रदान कर सकते हैं तो यह बहुत अच्छा होगा!
अनिलुरसफुलगेन्स

1
@AilurusFulgens - आप अपने डेटाबेस में एक LockedBy विशेषता (और संभवतः एक LockedOn टाइमस्टैम्प) जोड़ सकते हैं। जब भी क्लाइंट अपडेट इंटरेक्शन शुरू करता है, आपके एप्लिकेशन कोड में आप उपयोगकर्ता का नाम और समय निर्धारित करते हैं। जब ग्राहक समाप्त हो जाता है तो आप इसे परेशान करते हैं - आपको तब संघर्षों और समय-सीमा आदि को हल करने के लिए कुछ व्यावसायिक नियमों को अपनाने की आवश्यकता होती है
जेम्स एंडरसन

2

एपीआई में टोकन का उपयोग करना बहुत आम है, ये टोकन आमतौर पर हेडर के रूप में भेजे जाते हैं और एक स्पष्ट जीवन चक्र होता है। उदाहरण के लिए OAuth पर विचार करें।

आपकी प्रोग्रामिंग भाषा या रूपरेखा के बावजूद, REST API समान हैं।

मैं कई परिदृश्यों के बारे में सोच सकता हूँ जहाँ आप संगामिति को सीमित करना चाहते हैं, उनमें से दो हैं:

  1. एकाधिक ग्राहक डेटाबेस पंक्ति की तरह समान संसाधनों को अपडेट करते हैं। उदाहरण के लिए: दो समवर्ती अनुरोध, एक रिकॉर्ड को हटाता है और दूसरा उसी रिकॉर्ड को अपडेट करने का प्रयास करता है। आपके डेटाबेस और आपने इसे कैसे सेट किया है, इसके आधार पर, आपको रिकॉर्ड या अमान्य ऑपरेशन पर लॉक मिल सकता है क्योंकि डेटा अलग होगा या मौजूद नहीं होगा।

  2. एक सुपर उपयोगकर्ता या व्यवस्थापक एपीआई के साथ विशेष क्रियाएं करता है।


इन मामलों में क्या करना है?

  1. संसाधनों तक पहुँच को सिंक्रनाइज़ करने के लिए डेटाबेस, सिंगलटन, लॉक और इसी तरह के तंत्र में लेनदेन का उपयोग करें।

  2. टोकन काम कर सकता है, मुझे लगता है कि यह बेहतर होगा कि आप क्लाइंट के बारे में जानकारी स्टोर न करें, सिर्फ टोकन के बारे में। एक कदम पर आप उपयोगकर्ता को मान्य कर सकते हैं और टोकन निर्दिष्ट कर सकते हैं। फिर बस यह सत्यापित करें कि टोकन जीवित है और मान्य है। एक टोकन का उपयोग करें जिसे अतिरिक्त जानकारी प्राप्त करने के लिए डिक्रिप्ट किया जा सकता है। आप स्टोर कर सकते हैं यदि यह एक विशेष टोकन है और केवल एक बार में अनुमति देता है। इस तरह आप टोकन को मान्य करते हैं, उपयोगकर्ता को नहीं।

आशा है कि ये आपकी मदद करेगा।


हाँ, मैं एक टोकन और OAuth तंत्र की समानता के बारे में प्रतिक्रिया की उम्मीद कर रहा था। हालांकि अंतिम एक प्रमाणीकरण के लिए समर्पित है। मुझे आपके परिदृश्य का संकेत नहीं मिला। 1. एक REST API में संगामिति से निपटने के लिए मुश्किल हिस्सा स्टेटलेसनेस की कमी को बनाए रखना है ... जिसका अर्थ है कि सर्वर क्लाइंट के बारे में जानकारी संग्रहीत नहीं करता है। आपका परिदृश्य 2 वास्तव में मैं वर्तमान में क्या कर रहा हूँ! :)
AilurusFulgens

क्या मैंने आपके सवाल का जवाब दिया?
पाब्लो ग्रानडोस

कोई खेद नहीं। मैंने आपके उत्तर को गलत ठहराया क्योंकि यह समस्या का एक अच्छा अवलोकन देता है लेकिन दुर्भाग्य से, imo, यह वास्तव में इससे नहीं निपट रहा है।
अनिलुरसफुलगेन्स

0

वास्तव में अकेला भी बहुत आदिम है। आप आरईएसटी के साथ शुरुआत कर सकते हैं, लेकिन अंततः, आपके समृद्ध एप्लिकेशन को लेनदेन के साथ जुड़ने और अपडेट के साथ प्रश्नों की आवश्यकता होगी। हर डेवलपर अपने आप में इन चीजों को जोड़ने का प्रयास कर रहा है, त्रुटि प्रवण और असंगत होगा। सौभाग्य से, ओडटा नामक एक उभरता हुआ मानक है जो बस ऐसा करता है। यह REST और प्रदान करता है (1) क्वेरी भाषा के शीर्ष पर परतें, जो नेविगेशनल गुणों (विदेशी कुंजियों को उजागर किए बिना) का उपयोग करके सरल जुड़ने की अनुमति देता है, और (2) बैच प्रसंस्करण जिसमें परमाणु परिवर्तन सेट शामिल हैं।

यहां देखें (1) https://stackoverflow.com/a/3921423/471129 , और,

यहां देखें और (2) https://stackoverflow.com/a/21939972/471129 के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.