कमांड में पश्च-सत्यापन त्रुटियों को कैसे प्रबंधित करें (DDD + CQRS)


18

उदाहरण के लिए, जब आप एक रजिस्टर फॉर्म जमा करते हैं, तो आपको Domain Model( WriteModelइन CQRS) जांच करनी होती है कि यह वैध स्थिति में है (उदाहरण, ईमेल पता वाक्यविन्यास, आयु, आदि)।

फिर आप एक बनाते हैं Command, और इसे एक को भेजते हैं Command Bus

मैं समझता हूं कि कमांड्स को कुछ भी वापस नहीं करना चाहिए।

तो आप एक त्रुटि से परे कैसे संभालते हैं Command Bus? (उदाहरण के लिए, उपयोगकर्ता ने उसी के साथ 1 सेकंड पहले पंजीकृत किया था username/email)।

आप कैसे जानते हैं कि कमांड विफल हो गई है, और आप त्रुटि कैसे जानते हैं?


2
आपको इवेंट बस की आवश्यकता नहीं है। क्यूक्यूआरएस को लागू करते समय हर किसी को लगता है कि आपको एक इवेंट बस की आवश्यकता क्यों है, मुझे अभी पता नहीं है। CQRS का सीधा सा मतलब है कि आप पूरी तरह से अलग लिखते हैं और पढ़ते हैं, अलग चिंताएँ बनाते हैं। जब तक आप ऐसा करते हैं, आपके पास CQRS है। आपकी आज्ञाओं को भी अतुल्यकालिक होने की आवश्यकता नहीं है। यदि आपके लिए त्रुटि रिपोर्टिंग कार्य के साथ सिंक्रोनस कमांड होता है, तो ऐसा करें।
एंडी

1
सफल होने पर कमांड्स को कुछ भी वापस नहीं करना चाहिए । यह विचार CQS से शुरू हुआ था, जिसका निहितार्थ था कि कमांड अभी भी त्रुटि पर एक अपवाद फेंक सकता है। आप जो वर्णन कर रहे हैं वह एक तरफ़ा कमांड है। उसी के संबंध में यह उत्तर देखें ।
कासे स्पीकमैन

जवाबों:


4

मैं समझता हूं कि कमांड्स को कुछ भी वापस नहीं करना चाहिए।

यह एक दृश्य है, लेकिन यह पूरी तरह से पत्थर में सेट नहीं है। HTTP में राइट्स (PUT, POST, DELETE) पर विचार करें - ये सभी संदेश कमांड हैं, इस अर्थ में कि वे अनुरोध के साथ संदेश हैं कि संसाधन स्थिति बदलते हैं, और फिर भी वे सभी प्रतिक्रियाएं देते हैं।

तो आप कमांड बस से परे एक त्रुटि को कैसे संभालते हैं? (उदाहरण के लिए, उपयोगकर्ता उसी उपयोगकर्ता नाम / ईमेल के साथ 1 सेकंड पहले पंजीकृत हुआ)।

आप कैसे जानते हैं कि कमांड विफल हो गई है, और आप त्रुटि कैसे जानते हैं?

तो ऐसे मामले में जहां आप कमांड हैंडलर के साथ सीधे संवाद कर रहे हैं, एक लौटाया गया संदेश यह स्वीकार करने के लिए पूरी तरह से उचित तरीका है कि कमांड प्राप्त और संसाधित हो गया है।

यदि आप एक बस की तरह मिडलवेयर के एक टुकड़े का उपयोग कर रहे हैं, जो आपको सीधे लक्ष्य के साथ संवाद करने से रोकता है, तो मैं आपको सुझाव दूंगा कि आप अतुल्यकालिक संदेश पैटर्न देखें - आपको संदेश भेजने के लिए कमांड हैंडलर कैसे मिलता है फोन करने वाले?

एक विचार यह है कि कमांड के परिणाम की सदस्यता लें; यह होप के एंटरप्राइज इंटीग्रेशन पैटर्न में कुछ विचारों से उधार लेता है। मूल विचार यह है कि चूंकि क्लाइंट को भेजे गए कमांड संदेश से परिचित है, इसलिए यह कमांड संदेश के परिणामस्वरूप प्रकाशित किसी भी नए संदेश की सदस्यता लेने के लिए अच्छी तरह से तैनात है। कमांड हैंडलर, डेटा को रिकॉर्ड की पुस्तक में सहेजने के बाद, घटनाओं की घोषणा करता है कि परिवर्तन सफल रहा, और ग्राहक उन घटनाओं के लिए सदस्यता लेता है - संदेश में विभिन्न पहचानकर्ताओं के संयोग पर विचार करके सही घटनाओं को पहचानना (कारण आईडी) सहसंबंध आईडी , और इसी तरह)।

वैकल्पिक दृष्टिकोण थोड़ा अधिक प्रत्यक्ष हैं। संदेश को कॉलबैक में शामिल करना होगा, जिसे संदेश को सफलतापूर्वक संभाला जाने के बाद कमांड हैंडलर द्वारा आमंत्रित किया जा सकता है।

एक बहुत ही समान विकल्प आदेश हैंडलर को पावती लिखने के लिए कमांड संदेश में स्थान आरक्षित करना है - चूंकि क्लाइंट के पास पहले से ही कमांड संदेश है, सर्किट पहले से ही पूरा हो गया है। " वादा " या " पूर्ण भविष्य" के बारे में सोचो संदेश कमांड हैंडलर को बताता है कि पावती कहां लिखनी है; क्लाइंट को ऐसे संकेत करना (काउंटडाउन लैच) कि पावती उपलब्ध है।

और निश्चित रूप से, आपके पास मिडलवेयर को हटाने का अतिरिक्त विकल्प है जो कि बस सही काम करने के तरीके से मिल रहा है।

उदाहरण के लिए, उपयोगकर्ता ने उसी उपयोगकर्ता नाम / ईमेल के साथ 1 सेकंड पहले पंजीकृत किया था

यदि आप उपयोगकर्ता पंजीकरण को बेकार में संभाल रहे हैं, तो जरूरी नहीं कि वह त्रुटि हो - जब तक कि एक प्रतिक्रिया नहीं देखी जाती तब तक संदेशों को दोहराना कम से कम एक बार वितरण सुनिश्चित करने का एक सामान्य तरीका है।


2

उदाहरण के लिए, जब आप एक रजिस्टर फॉर्म जमा करते हैं, तो आपको डोमेन मॉडल (सीक्यूआरएस में राइटमॉडल) की जांच करनी होगी कि यह वैध स्थिति में है (उदाहरण, ईमेल पता वाक्यविन्यास, आयु, आदि)

सत्यापन कई प्रकार के होते हैं। जब आप ईमेल पता वाक्यविन्यास और आयु प्रारूप के लिए जाँच करते हैं तो सत्यापन एक प्रकार का सत्यापन होता है जो एक कमांड कर सकता है। यह वास्तव में एक डोमेन चिंता का विषय नहीं है। ऐसा प्रतीत हो सकता है क्योंकि कुछ डोमेन विशेषज्ञ आपको उन विशिष्टताओं को बताएंगे, लेकिन आपको कमांड निर्माण में इस तरह का सत्यापन करना चाहिए। वास्तव में, सामान्य विचार यह है कि सत्यापन जल्द से जल्द किया जाए क्योंकि एक कमांड बनाए जाने के बाद और एक बीएस को भेजना कार्रवाई करने के लिए अधिक जटिल है।

तो आप कमांड बस से परे एक त्रुटि को कैसे संभालते हैं? (उदाहरण के लिए, उपयोगकर्ता उसी उपयोगकर्ता नाम / ईमेल के साथ 1 सेकंड पहले पंजीकृत हुआ)।

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

आप कैसे जानते हैं कि कमांड विफल हो गई है, और आप त्रुटि कैसे जानते हैं?

यदि एक अतुल्यकालिक आदेश को एक अग्रेजी के कारण एग्रीगेट द्वारा अस्वीकार कर दिया जाता है, तो कुछ प्रतिपूरक कमांड जारी करके कुछ उपाय किए जाने चाहिए जो किसी भी तरह कमांड के जारीकर्ता को सूचित करता है (यानी एक स्पष्टीकरण ईमेल भेजें जो कमांड विफल हो)।

डुप्लिकेट ईमेल के साथ समस्या यह है कि आप एक ईमेल नहीं भेज सकते क्योंकि वह ईमेल पता किसी अन्य व्यक्ति का है, इसीलिए मैं इसे बस में कमांड भेजने से पहले जाँचता हूँ।


1

सजा एक डेकोरेटर में किया जाना चाहिए। तब किसी भी कमांड को मान्यता की आवश्यकता होती है, जिसे सजाया जा सकता है।

मान्यताओं को अपवादों के साथ संभाला जा सकता है यदि आपकी वापसी आपके आदेश के साथ शून्य हो जाती है, तो उन्हें दिए गए कार्य परिणाम के साथ सिंक या async कॉल के साथ उठाया जा सकता है।

एक अन्य संभावना एक प्रकार के "क्वेरी" के रूप में सत्यापन के बारे में सोचना है जो एक सत्यापन परिणाम वापस लौटाएगा। सत्यापन क्वेरी चलाएँ, और फिर यदि पास हो, तो कमांड चलाएँ। यह डेकोरेटर दृष्टिकोण का एक विकल्प होगा।


मुझे अपवाद दृष्टिकोण पसंद है क्योंकि यह सबसे साफ तरीका है। लेकिन इसके लिए अपवाद भी भारी नहीं हैं?
एरडेव

1
HI @EresDev - हाँ वे भारी हैं। लेकिन, मुझे नहीं पता कि आपका डेटा "वैध" कैसे है। कहते हैं कि 1000 में से 2 रिकॉर्ड वैध नहीं हैं। अपवाद व्यवहार्य हो सकते हैं क्योंकि वे वास्तव में असाधारण स्थिति हैं। अब 1000 रिकॉर्डों पर विचार करें, जो 200 मान्य नहीं हैं। उस कारण में, हाँ अपवादों से बचा जाना चाहिए क्योंकि आपके डेटा का 20% मान्य नहीं है। इसलिए, मैं आपके वर्तमान डेटा वैधता के आधार पर इस दृष्टिकोण को चुनने या न चुनने का निर्णय लेने के लिए इसे छोड़ देता हूं। :)
जॉन

मैं यह कहकर इसे जोड़ूंगा कि अगर हम पंजीकरण फॉर्म का उदाहरण रखते हैं, जहां मुझे लगता है कि 50% या इससे भी अधिक उपयोगकर्ता पहले अमान्य डेटा डालते हैं, तो अपवाद अभी भी ठीक हैं। वेब एप्लिकेशन बैकएंड में, आप ज्यादातर वैध डेटा प्राप्त करते हैं, क्योंकि फ्रंटेंड भी सत्यापन कर रहे हैं। आप केवल तभी प्राप्त करते हैं, जब किसी ने किसी दुर्लभ अवसर से या किसी के इर्दगिर्द बेवकूफ बना दिया हो। इसलिए, अपवाद इस मामले में बहुत ठीक हैं।
एरडेव डे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.