कैसे जोड़ें / बनाएँ * कमांड को CQRS + इवेंट सोर्सिंग आर्किटेक्चर में संभाला जाना चाहिए


11

मैं इवेंट सोर्सिंग के साथ CQRS पैटर्न का उपयोग करके अपने पहले आवेदन को लागू करना चाहता हूं। मैं सोच रहा हूं कि कैसे कुल जड़ों के निर्माण को ठीक से संभाला जाए। मान लीजिए कि कोई CreateItem कमांड भेजता है। इसे कैसे संभाला जाना चाहिए? इवेंट आइटम कहाँ संग्रहीत किया जाना चाहिए? एक नए आइटम की पहली घटना के रूप में? या क्या मुझे किसी प्रकार की आइटमलिस्ट इकाई चाहिए जो सभी वस्तुओं को एकत्रित करती है और इसकी घटना सूची में केवल आइटमकृत ईवेंट होते हैं?

उदी दहन का सुझाव है कि कुल जड़ें न बनाएं और हमेशा किसी तरह की लाई विधि का उपयोग करें। लेकिन मैं कुछ ऐसा कैसे प्राप्त कर सकता हूं जो नया हो और निश्चित रूप से कोई आईडी असाइन नहीं की गई है। मैं इसके पीछे के विचार को समझता हूं और यह सोचना बहुत ही उचित है कि एक नई वस्तु एक ऐसी वस्तु है जिसकी स्थिति शून्य घटनाओं से बनी है। लेकिन मुझे इसका उपयोग कैसे करना चाहिए? क्या मुझे अपनी रिपॉजिटरी में एक अलग विधि पसंद करनी चाहिए getNewItem()या इसके बजाय मेरी get(id)विधि को स्वीकार करना Optional<ItemId>चाहिए?

संपादित करें: खुदाई के कुछ समय बाद मुझे अभिनेताओं का उपयोग करके उपरोक्त पैटर्न का वास्तव में दिलचस्प कार्यान्वयन मिला । लेखक कुल बनाने के बजाय, नए बनाए गए UUID के साथ कुछ प्रकार के भंडार से इसे पुनः प्राप्त करता है। इस दृष्टिकोण का दोष यह है कि वह एक अस्थायी असंगति राज्य के लिए अनुमति देता है। मैं यह भी सोच रहा हूं कि मैं deleteइस तरह के दृष्टिकोण के साथ विधि कैसे लागू कर सकता हूं । बस हटाए गए ईवेंट को एग्रीगेट की ईवेंट सूची में जोड़ें?


1
मुझे संदेह है कि उदी का पद-नाम भ्रामक है। IMHO ऐसा लगता है कि उसका वास्तविक उद्देश्य यह है कि हौसले से बनाए गए AR को हमेशा किसी अन्य स्थान से पहुंच योग्य होना चाहिए, इस तरह से कि क्यों / कैसे / किसने निर्णय लिया कि नए AR को बनाने की आवश्यकता है, के संदर्भ को कैप्चर करता है। बाकी सब कुछ इस बारे में है कि किसी विशेष कार्यान्वयन (NHibernate?) को कैसे प्रबंधित करना आसान हो सकता है।
डेरेन

2
ध्यान दें कि उदी दहन लेख जिसे आप विशेष रूप से संदर्भित कर रहे हैं, कहते हैं कि उसकी सलाह इवेंट सोर्सिंग पर लागू नहीं हो सकती है: udidahan.com/2009/06/29/dont-create-aggregate-roots/…
ईज़ी हार्ट

जवाबों:


13

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

उडी विलोपन पर बहुत अच्छी तरह से लिखते हैं: http://www.udidahan.com/2009/09/01/dont-delete-just-ontont/ । मुख्य विचार यह है, कि आप कभी भी कुछ भी नहीं हटाते हैं। हमेशा पीछे एक डोमेन ऑपरेशन होता है, जिसे हम कैप्चर करना चाहते हैं। जैसे एक आदेश को रद्द किया जा रहा है, हटाए जाने के बजाय। इसे पढ़ें, यह बहुत अच्छी पोस्ट है।

डीडीडी और विशेष रूप से इवेंट सोर्सिंग, दोनों खातों पर मुख्य बिंदु यह है कि आपको कभी भी सीधे सीआरयूडी-ऑपरेशन नहीं करना चाहिए। यदि आप खुद को ऐसी स्थिति में पाते हैं, जहां आपको वास्तव में कुछ डेटा डालने, अपडेट करने या हटाने की आवश्यकता होती है, और वास्तव में इसके पीछे कोई डोमेन ऑपरेशन नहीं है, तो शायद डीडीडी और इवेंट सोर्सिंग उस बाध्य संदर्भ के लिए एक अच्छा फिट नहीं है । आप इन दोनों को संयोजित करने के लिए स्वतंत्र हैं जब तक आप चाहते हैं कि एक एकल बद्ध संदर्भ एक सिद्धांत का पालन करता है। इस तरह से CRUD- शैली बाउंडेड संदर्भ डेटाबेस में कुछ पंक्ति बना सकता है, जो कि एक इकाई और एक अन्य बाध्य संदर्भ में एक एग्रीगेट रूट बन जाता है, जहां अब आप AR को पुनः प्राप्त कर सकते हैं और इसे बनाना नहीं है।


2
"शायद DDD और इवेंट सोर्सिंग उस बंधे हुए संदर्भ के लिए एक अच्छी फिट नहीं है।" आपको डीडीडी की बात सही लगी। इसे सिर्फ शैतान की महिमा के लिए हर मामले में लागू नहीं किया जाना चाहिए, लेकिन केवल तब जब किसी को अनिश्चित नियमों से भरे जटिल डोमेन से निपटने की आवश्यकता हो। व्यक्तिगत रूप से मैंने इसे कानूनी सॉफ्टवेयर के लिए किया है जहां आवश्यकताएं तर्क द्वारा संचालित नहीं होती हैं।
येगोर चुमाकोव

2
इस वाक्य के लिए +1 "उस बंधे हुए संदर्भ के लिए।" :)
सोंगो

2
+1 क्रियाओं 'ऐड' और 'क्रिएट' का उपयोग दृढ़ता से सुझाव देता है कि आप अभी भी अपने डोमेन के बारे में एक अच्छे पुराने सारणीबद्ध डेटाबेस के साथ बातचीत के संदर्भ में सोच रहे हैं। आपके डोमेन / बंधे हुए संदर्भ को जाने बिना मैं यह नहीं कह सकता कि यह उचित है या नहीं। दृढ़ता को अनदेखा करें, पहले COMMANDS और EVENTS पर ध्यान केंद्रित करें (उर्फ इरादे और भविष्य) जो आपके डोमेन के लिए अद्वितीय हैं, फिर चिंता करें कि राज्य को कैसे बनाए रखा जाए, जो एक समस्या है जिसे पहले सैकड़ों बार हल किया जा चुका है।
मैट

"क्रिया 'ऐड' और 'क्रिएट' का उपयोग इस बात का प्रबल संकेत है कि आप अभी भी अपने डोमेन के बारे में एक अच्छे पुराने सारणीबद्ध डेटाबेस के साथ बातचीत के संदर्भ में सोच रहे हैं" हम्म। जब आपके पास एक यूआई डिज़ाइन होता है जिसमें एक बड़ा 'कुछ जोड़ें' बटन होता है, तो दुख की बात है, यह इरादा है; सचमुच कुछ नया जोड़ने के लिए। मैं आमतौर पर आपके साथ सहमत हूं, लेकिन हम यहां डेटाबेस स्तर पर बात नहीं कर रहे हैं, कभी-कभी जोड़ें या बनाएं वास्तव में उपयोग करने के लिए सही शब्द हैं।
designermonkey

1
@designermonkey जब आपके पास UI में बटन हैं, तो क्या आपके पास वास्तव में उनके पीछे एक डोमेन ऑपरेशन है? शायद, लेकिन 10 में से 9 बार वास्तव में उस बाध्य संदर्भ में एक जटिल डोमेन ऑपरेशन की कोई आवश्यकता नहीं है। और शुद्ध CRUD ऑपरेशन सिर्फ इतना है, एक शुद्ध CRUD ऑपरेशन है, और इस तरह के रूप में संभाला जाना चाहिए। केवल जब डोमेन मॉडल की जटिलता की आवश्यकता होती है, तो इसका उपयोग किया जाना चाहिए। इस प्रकार विभिन्न डिज़ाइन सिद्धांतों के साथ अलग-अलग बंधे हुए संदर्भ।
तुक्का हापानीमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.