2012-09-09 14 views
12

सीक्यूआरएस के बारे में एक बात नहीं है जो मुझे नहीं मिलता है: पढ़े गए मॉडल को कैसे अपडेट किया जाए जब उठाए गए ईवेंट में पढ़ने वाले मॉडल को अपडेट करने के लिए आवश्यक विवरण शामिल न हों।सीक्यूआरएस कार्यक्रमों में पढ़ने के मॉडल को अपडेट करने के लिए आवश्यक विवरण शामिल नहीं हैं

दुर्भाग्य से, यह एक आम परिदृश्य है।

उदाहरण: मैं एक समूह को एक उपयोगकर्ता जोड़ता हूं, इसलिए मैं एक addUserToGroup (userId, groupId) कमांड भेजता हूं। इसे प्राप्त किया जाता है, कमांड हैंडलर द्वारा प्रबंधित किया जाता है, userAddedToGroup ईवेंट बनाया, संग्रहीत और प्रकाशित किया जाता है।

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

तो सवाल यह है कि: मैं इस परिदृश्य को कैसे संभाल सकता हूं?

वर्तमान में, चार विकल्प मेरे मन के लिए आते हैं, सभी उनकी विशिष्ट नुकसान के साथ:

  1. पढ़ने मॉडल डोमेन पूछता है। => निषिद्ध, और यहां तक ​​कि संभव नहीं है, क्योंकि डोमेन में केवल व्यवहार है, नहीं (सार्वजनिक) राज्य।

  2. पढ़ा गया मॉडल समूह के नाम को पढ़ने के मॉडल में किसी अन्य तालिका से पढ़ता है। => काम करता है, लेकिन अगर कोई मिलान तालिका नहीं है तो क्या होगा?

  3. घटना के लिए आवश्यक डेटा जोड़ें। => काम नहीं करता है, क्योंकि इसका मतलब है कि मुझे सभी पिछली घटनाओं को भी अपडेट करना था, और मैं यह नहीं देख सकता कि मुझे कौन सा डेटा एक दिन की आवश्यकता हो सकती है।

  4. घटना को "सामान्य" ईवेंट हैंडलर के माध्यम से संभाल न करें, लेकिन ईवेंट स्टोर से संबंधित पृष्ठभूमि में एक ईटीएल प्रक्रिया शुरू करें, निरंतर डेटा बनाता है और पढ़ने वाले मॉडल को लिखता है। => काम करता है, लेकिन मेरे लिए यह एक साधारण परिदृश्य के लिए बहुत अधिक ओवरहेड लगता है।

तो सवाल यह है कि मैं इस परिदृश्य से सही तरीके से कैसे निपटूं?

उत्तर

5

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

SubmitPurchaseOrder 
    Shopping Cart Id 
    Shipping Address 
    Billing Address 

जिसके परिणामस्वरूप घटना कैसा लग सकता है निम्नलिखित:

PurchaseOrderSubmitted 
    Items (Id, Name, Amount, Price) 
    Shipping Address 
    Shipping Provider 
    Our Shipping Cost 
    Shipping Cost billed to Customer 
    Billing Address 
    VAT % 
    VAT Amount 
    First Time Customer 
    ... 

आमतौर पर जानकारी डोमेन मॉडल के लिए उपलब्ध है (या तो द्वारा आदेश द्वारा प्रदान की जा रही या जैसा कि संबंधित कुल की आंतरिक स्थिति या प्रसंस्करण के हिस्से के रूप में गणना की जा रही है।)

इसके अतिरिक्त घटना को पढ़ने वाले मॉडल या यहां तक ​​कि एक अलग बीसी से पूछकर समृद्ध किया जा सकता है (उदाहरण के लिए राज्य के आधार पर वास्तविक वैट% प्राप्त करने के लिए) प्रक्रिया के दौरान एनजी।

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

+0

ठीक है, अब तक, मुझे मिल गया ;-) जो मुझे अभी तक नहीं मिला है: मान लीजिए कि मेरी खरीद ऑर्डर सबमिट की गई घटना _today_ में VAT नहीं है। अब, भविष्य में कुछ समय के लिए तेजी से आगे बढ़ें, जहां मैं करता हूं। बेशक मैं एक नया कार्यक्रम बना सकता हूं, मूल रूप से वी 2.0, जिसमें VAT शामिल है - लेकिन यह अतीत के सभी आदेशों में मेरी सहायता नहीं करता है, है ना? मैं उससे कैसे निपटूं? –

+1

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

+0

ठीक है, धन्यवाद, यह समझ में आता है :-)! –

7

दो सामान्य समाधान हैं।

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

2) एक बार में कई धाराओं को प्रोजेक्ट करें। एक प्रोजेक्टर लिखें जो विभिन्न धाराओं से जानकारी देखता है और उन्हें एक साथ जोड़ता है। आप उपयोगकर्ता और समूह ईवेंट के साथ-साथ आपके उपयोगकर्ता को समूह ईवेंट में जोड़ सकते हैं। आपके सिस्टम में घटनाओं के क्रम के आधार पर, आप जानते हैं कि समूह के नाम से पहले उपयोगकर्ता एक समूह में है, लेकिन आपको जाने से पहले आपको अपने ईवेंट स्टोर के सामान्य गुणों को जानना चाहिए।

+0

धन्यवाद, यह बहुत स्पष्ट किया गया है :-)! –

+1

मुझे यकीन नहीं है कि मैं # 2 समझता हूं। क्या प्रक्षेपण धारा स्ट्रीम करता है या सिर्फ एक नई घटना की प्रतीक्षा करता है? क्या इस प्रक्रिया की खोज के लिए मैं एक महत्वपूर्ण काम कर सकता हूं? मैंने "इवेंट एनरिकमेंट" सीखा लेकिन यह एक बुरा स्लान लगता है। – Raif

+0

एक प्रक्षेपण आम तौर पर एक घटक होता है जो घटनाओं को उत्सर्जित करते हुए एक या अधिक धाराओं को "निरंतर" पढ़ता है, और एक रिलेशनल डेटाबेस जैसे पढ़ने वाले मॉडल में परिवर्तन पेश करता है। –

0

विकल्प 2 ठीक होगा, "समूह में नाम मिलान करने के बारे में क्या है 'नाम-पाठ तालिका" के बारे में आपका प्रश्न लागू नहीं होगा। कोई डेटा हटाया जाना चाहिए, पिछली घटना (हटाएं समूह कहें) को अमान्य कर दिया जाना चाहिए। अंत में समूह तालिका में पंक्ति प्रभावी ढंग से होती है और आप समूह के नाम को बिना किसी समस्या के पढ़ सकते हैं। एकमात्र स्पष्ट समस्या गति असंगतता हो सकती है, लेकिन यह एक और मुद्दा है, घटनाओं को व्यवस्थित रूप से संसाधित किया जाना चाहिए चाहे वे संसाधित हो रहे हों।

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