design - बुय डोमेन name




एक समृद्ध डोमेन मॉडल को स्केल करना (4)

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

दूसरा दृष्टिकोण, जब मैं डीडीडी के साथ काम कर रहा हूं, तब मेरा ध्यान अधिक रहा है; मैं अपने मॉडल को कैसे बनाऊं, जिससे कि बहुत अधिक डीडीडी भलाई का त्याग किए बिना "लोड करने योग्य" हो वर्षों से मेरी परिकल्पना हमेशा रही है कि बहुत सारे डीडीडी मॉडल मॉडल डोमेन अवधारणाएं हैं जो वास्तव में सभी स्वीकार्य डोमेन राज्यों का योग है, सभी व्यावसायिक प्रक्रियाओं में और विभिन्न राज्यों जो समय के साथ प्रत्येक व्यवसाय प्रक्रिया में होती हैं। यह मेरा विश्वास है कि इन लोडिंग समस्याएं बहुत कम हो जाती हैं यदि डोमेन मॉडल प्रक्रियाओं / राज्यों के मामले में थोड़ा अधिक सामान्य हो। इसका आम तौर पर इसका अर्थ है कि "ऑर्डर" ऑब्जेक्ट नहीं है क्योंकि एक ऑर्डरर आमतौर पर कई अलग-अलग राज्यों में मौजूद है जो कि काफी अलग सिमेंटिक संलग्न हैं (शॉपिंगकार्टऑर्डर, शिप ऑडर, इनवॉइसोड ऑर्डर, हिस्टोरिकल ऑर्डर)। यदि आप इनकैप्लेट करने का प्रयास करते हैं तो यह एक एकल ऑर्डर ऑब्जेक्ट है, आप हमेशा बहुत सारे लोडिंग / निर्माण समस्याओं के साथ समाप्त होते हैं।

लेकिन यहां कोई रजत बुलेट नहीं है ..

https://code.i-harness.com

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

मैं इसे एक मध्यम-आकार वाली एक-मैन प्रोजेक्ट (> 100 किमी जावा की) पर प्रयोग कर रहा हूं और मुझे कई फायदे हैं, ज्यादातर लचीलेपन और रिफाक्टोरैबिलिटी जो कि यह डेटाबेस-उन्मुख दृष्टिकोण पर प्रदान करता है। मैं डोमेन वर्गों को जोड़ और निकाल सकता हूं, कुछ बटन दबा सकता हूं और एक नया डाटाबेस स्कीमा और एसक्यूएल परत रोल आउट कर सकता हूं।

हालांकि, मुझे अकसर ऐसे मुद्दों का सामना करना पड़ता है जहां मुझे इस तथ्य के साथ समृद्ध डोमेन तर्क को सुलझाना मुश्किल लगता है कि एप्लिकेशन का समर्थन करने वाला SQL डेटाबेस है। सामान्य तौर पर, यह सामान्य "1 + N प्रश्नों की समस्या" में परिणाम होता है, जहां आप एन ऑब्जेक्ट्स प्राप्त करते हैं, और फिर प्रत्येक ऑब्जेक्ट पर एक नॉर्टव्रियल विधि निष्पादित करते हैं जो कि क्वेरी को फिर से ट्रिगर करता है। इसे हाथ से अनुकूलित करना आपको एसक्यूएल प्रश्नों की एक निरंतर संख्या में प्रक्रिया करने की अनुमति देता है।

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

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

क्या डोमेन-चालित-डिजाइन और उसके रिच डोमेन मॉडल में सामंजस्य स्थापित करने के लिए एक बेहतर, क्लीनर तरीका है, इस तथ्य के साथ कि आप अपनी सभी संस्थाओं को स्मृति में नहीं रख सकते और इसलिए डेटाबेस बैकेंड तक सीमित हैं?


नहीं वास्तव में नहीं। ऐसा नहीं है कि मैं वैसे भी जानता हूं (हालांकि मैं इसके विपरीत डीडीडी के किसी भी अभिप्राय की प्रतिक्रियाओं को सुनना चाहता हूं)।

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

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


मेरे अनुभव में यह काम करने का एकमात्र तरीका है। यदि आप एक सिस्टम लिखते हैं जो पूरी तरह से छिपने या दृढ़ता को पूर्ण करने के लिए प्रयास करता है तो कोई रास्ता नहीं है कि आप दृढ़ता परत की विशेषताओं का उपयोग करके चीजों को अनुकूलित कर सकते हैं।

मैं हाल ही में इस मुद्दे के खिलाफ चल रहा हूं और एक समाधान पर काम कर रहा हूं जहां दृढ़ता परत इंटरफेस को लागू करने के लिए चुन सकते हैं जो ऑप्टिमाइजेशन का प्रतिनिधित्व करते हैं। मैं अभी इसके साथ खेल रहा हूं लेकिन अपने ListAUsers उदाहरण का उपयोग करने के लिए इसे इस तरह से चला जाता है ...

सबसे पहले एक ListAllUsers विधि लिखें जो डोमेन स्तर में सब कुछ करता है। थोड़ी देर के लिए यह काम करेगा, तब यह बहुत धीमी गति से शुरू हो जाएगा।

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

अब आप एक ऐसी परत लिख सकते हैं जो इन इंटरफेस की जांच करता है और यदि यह मौजूद है तो विशिष्ट विधि को कॉल करता है।

यह सही नहीं है और मुझे इस प्रकार की चीज़ के साथ काफी अनुभव नहीं है लेकिन मुझे लगता है कि कुंजी यह सुनिश्चित करना है कि यदि आप पूरी तरह से भोलेपन पद्धति का उपयोग कर रहे हैं तो सभी कोड अब भी काम करना चाहिए। किसी भी अनुकूलन को इसके अतिरिक्त के रूप में किया जाना चाहिए।


मेरा मानना ​​है कि आपको अपने डोमेन तर्क का हिस्सा होने के लिए क्वेरी परत पर विचार करना चाहिए। आपको अपने आप को अनुकूलित प्रश्नों को लिखने की अनुमति दी जानी चाहिए जो केवल आपके दृढ़ता समाधान के "अंतरंग" ज्ञान के साथ किया जा सकता है सब कुछ दूर सार करने की कोशिश मत करो इसके अलावा, बैच प्रसंस्करण आपके आवेदन का एक और हिस्सा है जिसे आपके डोमेन का ज्ञान रखने की अनुमति भी दी जानी चाहिए। बैच प्रसंस्करण से बचने की कोशिश करने के लिए मुझे यह अनावश्यक लगता है क्योंकि मैं इसे अपने डोमेन मॉडल में फिट नहीं कर सकता। आप हालांकि तरीकों को जोड़ सकते हैं: अपने डोमेन तर्क का उपयोग करते हुए, अपने ऑडियंस को कतार और अपने आप प्रत्येक को संभालने के लिए कौन सा ऑब्जेक्ट बदलना चाहिए, यह जानने के लिए क्वेरी का उपयोग करें।





domain-driven-design