2013-04-08 8 views
6

मैं a previous discussion I had with Jon Skeet का निर्माण कर रहा हूं।मैं क्लाइंट द्वारा जेनरेट किए गए GUID पर भरोसा क्यों नहीं कर सकता? पीके को क्लाइंट-GUID के एक समग्र और सर्वर-GUID के संयोजन के रूप में कुछ भी हल करता है?

मेरी परिदृश्य का सार इस प्रकार है:

  • ग्राहक आवेदन नए 'PlaylistItem' जिन वस्तुओं पर एक डेटाबेस में कायम करने की आवश्यकता बनाने की क्षमता है।
  • केस का उपयोग प्लेलिस्टइटम को इस तरह से बनाने की आवश्यकता है कि क्लाइंट को PlaylistItem प्रदर्शित करने से पहले सर्वर से प्रतिक्रिया पर इंतजार नहीं करना पड़े।
  • क्लाइंट PlaylistItem के लिए एक UUID उत्पन्न करता है, क्लाइंट में PlaylistItem दिखाता है और फिर सर्वर पर एक सहेजें आदेश जारी करता है।

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

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

अब, मैं थोड़ी देर के लिए इस समाधान का उपयोग कर रहा हूं, लेकिन मुझे समझ में नहीं आता कि मेरा समाधान क्लाइंट आईडी पर भरोसा करने से बेहतर क्यों है। यदि उपयोगकर्ता किसी अन्य उपयोगकर्ता की PlaylistItem ऑब्जेक्ट्स के साथ पीके टकराव को मजबूर करने में सक्षम है तो मुझे लगता है कि मुझे लगता है कि वे उस उपयोगकर्ता की PlaylistId भी प्रदान कर सकते हैं। वे अभी भी टक्कर लगी हो सकती है।

तो ... हाँ। ऐसा कुछ करने का सही तरीका क्या है? ग्राहक को यूयूआईडी बनाने की अनुमति दें, सफलतापूर्वक सहेजे जाने पर सर्वर एक अंगूठे ऊपर/नीचे देता है। यदि टक्कर मिलती है, तो ग्राहक परिवर्तनों को वापस लाएं और पता लगाने के बारे में सूचित करें?

उत्तर

2

एक अच्छा समाधान होगा निम्नलिखित: के शब्दों में सैम न्यूमैन के "Building Microservices":

बुला प्रणाली एक BatchRequest पोस्ट हैं, शायद एक स्थान जहां एक फाइल सभी डेटा के साथ रखा जा सकता है में से गुजर रहा। ग्राहक सेवा एक HTTP 202 प्रतिक्रिया कोड लौटाएगी, जो दर्शाती है कि अनुरोध स्वीकार कर लिया गया था, लेकिन अभी तक संसाधित नहीं किया गया है। बुला प्रणाली तो संसाधन प्रतीक्षा मतदान कर सकता है जब तक यह एक 201 यह दर्शाता है कि अनुरोध

तो पूरा हो गया है अपने मामले में बनाया गया प्राप्त करता है, आप सर्वर से पोस्ट कर सकता लेकिन तुरंत की तरह एक प्रतिक्रिया मिल "मैं बचत होगी PlaylistItem और मैं वादा करता हूं कि उसका आईडी यह होगा "। क्लाइंट (और उपयोगकर्ता) तब जारी रख सकता है जब सर्वर (शायद एपीआई भी नहीं, लेकिन एपीआई से संदेश प्राप्त करने वाले कुछ पृष्ठभूमि प्रोसेसर) को प्रक्रिया को सत्यापित करने, सत्यापित करने और अन्य करने के लिए अपना समय लगता है, संभवतः भारी तर्क जब तक यह इकाई को बचाता है। जैसा कि पहले बताया गया था, एपीआई उस अनुरोध की स्थिति के लिए एक अंतराल बिंदु प्रदान कर सकता है, और ग्राहक इसे मतदान कर सकता है और किसी त्रुटि के मामले में कार्य कर सकता है।

1

आप सर्वर पर उत्पन्न यूयूआईडी या इसी तरह के वैश्विक अद्वितीय पहचानकर्ता पर भरोसा कर सकते हैं। बस समझदारी से करो।

आपके अधिकांश टेबल/संग्रह में उपयोगकर्ता आईडी भी होगा या एक एफके के माध्यम से उपयोगकर्ता के साथ स्वयं को जोड़ने में सक्षम हो जाएगा।

यदि आप कोई सम्मिलित कर रहे हैं और एक दुर्भावनापूर्ण उपयोगकर्ता मौजूदा कुंजी का उपयोग करता है तो सम्मिलन विफल हो जाएगा क्योंकि रिकॉर्ड/दस्तावेज़ पहले से मौजूद है।

यदि आप कोई अद्यतन कर रहे हैं तो आपको यह सत्यापित करना चाहिए कि लॉग इन उपयोगकर्ता उस रिकॉर्ड का मालिक है या अधिकृत है (उदा। व्यवस्थापक उपयोगकर्ता) इसे अपडेट करने के लिए। यदि शुद्ध स्वामित्व लागू किया जा रहा है (यानी कोई व्यवस्थापक उपयोगकर्ता परिदृश्य नहीं) तो रिकॉर्ड/दस्तावेज़ का पता लगाने में आपके where खंड में आईडी और उपयोगकर्ता दोनों शामिल होंगे। अब तकनीकी रूप से उपयोगकर्ता आईडी जहां खंड में अनावश्यक है क्योंकि आईडी विशिष्ट रूप से एक रिकॉर्ड/दस्तावेज़ ढूंढ लेगा। हालांकि उपयोगकर्ता आईडी जोड़ना सुनिश्चित करता है कि रिकॉर्ड उस उपयोगकर्ता से संबंधित है जो अद्यतन कर रहा है और दुर्भावनापूर्ण उपयोगकर्ता नहीं।

मुझे लगता है कि एक एन्क्रिप्टेड टोकन या कुछ प्रकार का सत्र है कि सर्वर उपयोगकर्ता आईडी का पता लगाने के लिए डिक्रिप्ट कर रहा है और यह क्लाइंट द्वारा प्रदान नहीं किया जाता है अन्यथा यह स्पष्ट रूप से सुरक्षित नहीं है।

संबंधित मुद्दे

 संबंधित मुद्दे