डीडीडी - बड़ी संख्या में बच्चों के साथ सकल जड़ें


10

मैं इस प्रश्न को यह कहते हुए प्रस्तुत करूँगा कि मैं DDD के लिए अपेक्षाकृत नया हूँ इसलिए मैं यहाँ कुछ मूलभूत गलतियाँ कर रहा हूँ!

मैं एक ऐसी परियोजना पर काम कर रहा हूं जिसमें लेखा और लेनदेन की अवधारणाएं शामिल हैं (वित्तीय अर्थों में)। एक खाते में इसके खिलाफ दर्ज किए गए कई लेनदेन हो सकते हैं।

ऐसा लगता है कि खाता और लेन-देन दोनों ही संस्थाएं हैं, और यह खाता एक सकल जड़ है जिसमें लेन-देन तब होता है जब तक कि खाता के बिना कोई लेन-देन मौजूद नहीं हो सकता।

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

उत्तरार्द्ध मामले में, अगर मैं एक का उपयोग कर रहा था TransactionRepositoryमैं कुशलतापूर्वक उन वस्तुओं तक पहुंच सकता हूं जिनकी मुझे पूरी लोडिंग के बिना आवश्यकता होती है (संभवतः बहुत बड़ी) सूची। हालाँकि यह खाते के अलावा अन्य चीजों को लेन-देन के साथ काम करने की अनुमति देता है जिसका अर्थ है कि मैंने खाते की अवधारणा को कुल मूल के रूप में तोड़ दिया है।

लोग इस तरह की स्थिति को कैसे संभालते हैं? क्या आप एक समग्र रूट के लिए संभावित रूप से बड़ी संख्या में बच्चों को लोड करने की स्मृति और प्रदर्शन के निहितार्थ को स्वीकार करते हैं?

जवाबों:


9

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

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

सही समग्र आकार आदर्श रूप से किसी दिए गए व्यावसायिक लेनदेन में आपके द्वारा संशोधित किए गए परिवर्तनों से मेल खाता है, अधिक नहीं और कम नहीं। आपके उदाहरण में, यदि कई डोमेन आक्रमणकारी नहीं हैं जो कई वित्तीय लेनदेन से अधिक हैं, तो Transactionअपने आप में एक एग्रीगेट रूट बनाना सबसे अच्छा समाधान हो सकता है।


धन्यवाद, मैं स्थिरता सीमाओं पर पढ़ूंगा। मुझे लगता है कि लेन-देन करने के आपके सुझाव की अपनी मूल जड़ एक अच्छी हो सकती है; जैसा कि आप कहते हैं कि मेरे पास बहुत से लेन-देन करने वाले आक्रमणकारी नहीं हैं।
krixon

7

tl; dr - यदि आवश्यक हो तो नियम तोड़ें। DDD सभी समस्याओं को हल नहीं कर सकता; वास्तव में यह जो वस्तु विचार देता है वह अच्छी सलाह और एक अच्छी शुरुआत है, लेकिन कुछ व्यावसायिक समस्याओं के लिए वास्तव में बुरा विकल्प है। चीजों को कैसे करना है, इसके लिए एक संकेत पर विचार करें।


माता-पिता (खाते) के साथ सभी बच्चों (लेन-देन) को लोड करने के मुद्दे के लिए - ऐसा लगता है कि आपने n + 1 समस्या (Google से कुछ) में भाग लिया है, जिसे कई ORM ने हल किया है।

आप इसे आलसी बच्चों (लेन-देन) को लोड करके हल कर सकते हैं - केवल जब जरूरत हो।

लेकिन लगता है कि आप पहले से ही जानते हैं कि इस समस्या का समाधान करने के लिए आप एक TransactionRepository का उपयोग कर सकते हैं।

उस डेटा को 'छिपाने' के लिए, ताकि केवल खाता ही उसका उपयोग कर सके, आपको इसे स्टोर करने की भी आवश्यकता नहीं होगी, जहां कोई और नहीं, उसे सार्वजनिक संबंध तालिका की तरह इसे हटाना नहीं होगा। आप इसे किसी दस्तावेज़ DB में खाते के 'दस्तावेज़' के साथ संग्रहीत कर सकते हैं। किसी भी तरह से अगर किसी ने पर्याप्त प्रयास किया तो भी वे डेटा देख सकते हैं। और इसके साथ 'काम'। और जब आप नहीं देख रहे हैं, तो वे करेंगे!

तो आप अनुमतियाँ सेट कर सकते हैं, लेकिन फिर, आपको एक अलग प्रक्रिया के रूप में 'खाता' चलाना होगा।

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

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

असली जवाब SOA को खड़ा करना शुरू करना है। मेरे कार्यस्थल पर हमने उदी दहन 'वितरित कंप्यूटिंग' वीडियो देखे और nServiceBus (केवल हमारी पसंद) खरीदा। खातों के लिए एक सेवा बनाएं - अपनी प्रक्रिया, संदेश कतारों के साथ, एक संबंध डेटाबेस तक पहुंच केवल यह देख सकता है, और ... वायोला, आप प्रोग्राम में एसक्यूएल बयानों को हार्डकोड कर सकते हैं और यहां तक ​​कि कोबोल लेनदेन स्क्रिप्ट के एक जोड़े में फेंक सकते हैं (मजाक कर रहे हैं बेशक) लेकिन गंभीरता से ओओ / जावा स्नोब के सपने की तुलना में चिंताओं का अधिक अलगाव हो सकता है।

मैं इसे अच्छी तरह से मॉडलिंग करने की सलाह दूंगा; आप केवल एक मिनी-बाउंडेड काउंटेक्स के रूप में सेवा का इलाज करके समस्याओं के बिना यहां मूल रूट का लाभ उठा सकते हैं।

यह निश्चित रूप से एक खामी है। आप RPC (webservice, SOAP, या REST) ​​को केवल सेवाओं में और उनके बीच में या उनके बीच में नहीं कर सकते हैं या आपको अस्थायी युग्मन के कारण 'knot' नामक SOA एंटीपैटर मिलता है। आपको संचार पैटर्न, उर्फ ​​'पब-सब' का उपयोग करना होगा, जो इसे इवेंट हैंडलर और इवेंट राइजर्स की तरह है, लेकिन (1) प्रक्रियाओं के बीच (जो आप अलग-अलग मशीनों पर डाल सकते हैं यदि वे एक पर ओवरलोड हो रहे हैं)।

असली मुद्दा यह है कि आप एक ऐसी सेवा नहीं चाहते हैं जो किसी अन्य सेवा से 'ब्लॉक' या प्रतीक्षा करने के लिए डेटा प्राप्त करने की आवश्यकता है - आपको आग लगाना होगा और संदेश को भूलना होगा और अपने प्रोग्राम में एक हैंडलर को कहीं और ले जाने के लिए इसे पूरा करना होगा। इसका मतलब है कि आपको अपना तर्क अलग तरह से करना होगा। nServicebus इसमें से कुछ के साथ मदद करने के लिए 'गाथा' पैटर्न को स्वचालित करता है, लेकिन अंत में, आपको एक अलग कोडन शैली विकसित करनी होगी। आप अभी भी यह सब कर सकते हैं, बस इसे अलग तरीके से करना होगा!

Arnon Rotem-Gal-Oz की पुस्तक "SOA पैटर्न" इस बारे में कई सवालों के जवाब देती है। आवश्यकता पड़ने पर बाहरी सेवाओं के डेटा को समय-समय पर अपने स्वयं के सक्रिय करने के लिए 'सक्रिय सेवा पैटर्न' के उपयोग को शामिल करना (कई आरपीसी की आवश्यकता होती थी, या लिंक अविश्वसनीय / प्रकाशित / सदस्यता पारिस्थितिकी तंत्र में नहीं है)।

बस पूर्वावलोकन करने के लिए, UI को सेवाओं में RPC करना होगा। रिपोर्ट एक रिपोर्टिंग डेटाबेस से उत्पन्न होती हैं जो सेवाओं के डेटाबेस द्वारा खिलाया जाता है। कुछ लोगों का कहना है कि रिपोर्ट की जरूरत नहीं है और समस्या को दूसरे तरीके से हल किया जाना चाहिए। उस बात पर संदेह करो।

हालांकि अंत में, सभी चीजों को एक ही सेवा में ठीक से वर्गीकृत नहीं किया जा सकता है। रवीओली कोड पर दुनिया नहीं चलती है! इसलिए आपको नियम तोड़ने पड़ेंगे। यहां तक ​​कि अगर आपके पास कभी नहीं होगा, तो परियोजना के नए देवता इसे तब करेंगे जब आप इसे छोड़ देंगे। लेकिन चिंता न करें, यदि आप ऐसा करते हैं, तो आप जो follows५% नियम का पालन करते हैं, वह एक ऐसा कार्यक्रम बना देगा जो कहीं अधिक बनाए रखने योग्य है।

वाह, यह लंबा था।


विस्तृत प्रतिक्रिया के लिए धन्यवाद, मैं निश्चित रूप से SOA पर कुछ पढ़ना चाहूंगा।
krixon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.