CQ [R] S मॉडल में एक कमांड को कैसे ग्रैन्युलर होना चाहिए?


17

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

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

मैंने उदी दहन के विषय पर बहुत कुछ पढ़ा है, जो मूल रूप से ईएसबी आर्किटेक्चर (कम से कम माइक्रोसॉफ्ट की दुनिया में) पर गुरु है, लेकिन एक बात वह कहता है कि वास्तव में मुझे पहेली है:

जैसे-जैसे हम उन पर अधिक क्षेत्रों के साथ बड़ी इकाइयाँ प्राप्त करते जाते हैं, वैसे-वैसे हम उन्हीं संस्थाओं के साथ काम करते हुए अधिक अभिनेताओं को प्राप्त करते जाते हैं, और इस बात की संभावना अधिक होती है कि कुछ किसी समय में उनमें से कुछ विशेषता को छू लेगा, जिससे संगति संघर्षों की संख्या बढ़ जाएगी।

[...]

CQRS का एक मुख्य तत्व उपयोगकर्ता इंटरफ़ेस के डिज़ाइन को पुनर्व्यवस्थित कर रहा है ताकि हम अपने उपयोगकर्ताओं के इरादे पर कब्जा कर सकें, जैसे कि ग्राहक को पसंदीदा बनाना उपयोगकर्ता के लिए काम करने की एक अलग इकाई है जो ग्राहक को यह संकेत देता है कि वे चले गए हैं या वे मिल गए हैं विवाहित। डेटा परिवर्तन के लिए Excel जैसी UI का उपयोग इरादे पर कब्जा नहीं करता है, जैसा कि हमने ऊपर देखा।

- उदी दहन, स्पष्ट सीक्यूआरएस

उद्धरण में वर्णित दृष्टिकोण से, उस तर्क के साथ बहस करना कठिन है। लेकिन यह SOAs के संबंध में अनाज के खिलाफ जाता है। एक SOA (और वास्तव में सेवाएं सामान्य रूप से) मोटे अनाज वाले संदेशों से निपटने के लिए माना जाता है ताकि नेटवर्क चैट को कम किया जा सके - कई अन्य लाभों के बीच।

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

एसक्यूएल सर्वर में एक बैच अपडेट एक दूसरे का एक अंश ले सकता है जो एक बहुत ही उच्च-पैरामीटर वाली क्वेरी, तालिका-मूल्यवान पैरामीटर या बल्क सम्मिलित करने के लिए एक बड़ी तालिका देता है; इन सभी अद्यतनों को एक समय में संसाधित करना धीमा, धीमा, धीमा है , और OLTP डेटाबेस हार्डवेयर सभी को ऊपर / बाहर स्केल करने के लिए सबसे महंगा है।

क्या इन प्रतिस्पर्धी चिंताओं को समेटने का कोई तरीका है? क्या मैं इसके बारे में गलत तरीके से सोच रहा हूं? क्या इस समस्या का CQS / ESB दुनिया में एक प्रसिद्ध समाधान है?

यदि नहीं, तो कोई यह कैसे तय करता है कि एक कमांड में "सही स्तर" की ग्रैन्युलैरिटी क्या होनी चाहिए? क्या कुछ "मानक" एक शुरुआती बिंदु के रूप में उपयोग कर सकते हैं - डेटाबेस में 3NF की तरह - और केवल विचलन जब सावधान प्रोफाइलिंग एक संभावित महत्वपूर्ण प्रदर्शन लाभ का सुझाव देता है?

या यह संभवतः उन चीजों में से एक है जो विभिन्न विशेषज्ञों द्वारा कई मजबूत राय व्यक्त किए जाने के बावजूद, वास्तव में केवल एक राय है?

जवाबों:


7

"प्रत्येक गुण परिवर्तन" के विषय पर

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


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

@Aaronaught: परिभाषा है मनमाने ढंग से। एक कमांड की ग्रैन्युलैरिटी ऐसी होनी चाहिए जो आपके विशेष परिदृश्य के लिए समझ में आए । कोई एक आकार सभी को फिट नहीं है। यूआई में उपलब्ध मामलों या कार्यों या कार्यों का उपयोग करने के लिए कई निर्देश जैसे मिलान दिशा-निर्देश हैं - एक और है कम ग्रेन्युलर कमांड (कण के रूप में यवेस ने कहा कि डेटा से सावधान रहें जिसे तर्क नियंत्रण प्रवाह के रूप में व्याख्या किया गया है) पर अधिक बारीक कमांड पसंद करना है। लेकिन कोई कठिन और तेज़ नियम नहीं। क्या एक वास्तविक परिदृश्य है जहां "एक उपयोगकर्ता संभावित रूप से सैकड़ों या हजारों संयुक्त संस्थाओं और विशेषताओं को अपडेट कर रहा है"?
क्वेंटिन-स्टारिन

यह पूरी बात है! एक साथ गांठ मत लगाओ। व्यवहार के अनुसार विभाजित करें! कमांड / एंड-यूज़र के इरादे से संरेखित नहीं होने वाली कमांड में डेटा न डालें। और यह डाउनस्ट्रीम सिस्टम के बारे में नहीं है।
यवेस रेनहॉट

@qes: हमारे सिस्टम में ऐसे कई परिदृश्य हैं, बहुत वास्तविक और बहुत आवश्यक हैं। इसे यथासंभव सरल रूप से बताने के लिए, उन्हें डेटा के पूरे अनुक्रम को संशोधित करने की आवश्यकता होती है और ये क्रम केवल अनुक्रम के रूप में समझ में आते हैं। बेशक वे आमतौर पर इन परिवर्तनों को रिकॉर्ड से रिकॉर्ड नहीं करते हैं, वे इसके लिए कुछ एल्गोरिदम लागू करते हैं और फिर कुछ अपवादों को ठीक करते हैं। शायद यह सिर्फ CQS के साथ शुरू करने के लिए एक उपयुक्त परिदृश्य नहीं है, लेकिन यह निर्णय मेरे व्यापक प्रश्न का एक सबसेट है।
आरोहित

1
@qes: काफी साफ है, और यह एक जवाब है और अपने आप में। मैं निश्चित रूप से एक तार्किक ऑपरेशन की अवधारणा को समझता हूं (यह है कि मौजूदा सेवाओं को कैसे मॉडल किया जाता है), मुझे लगता है कि मैं अभी चिंतित हूं कि सीक्यूएस कुछ नियमों को बदलने के बारे में लगता है कि आप ऑपरेशन को कैसे परिभाषित करना चाहते हैं। "पारंपरिक" एसओए मोटे संभव परिभाषा से शुरू होता है और यदि आवश्यक हो तो अमूर्त सीढ़ी को नीचे ले जाता है; CQS की अब तक की मेरी समझ इसके विपरीत संकेत देती है, संभव है कि यह सबसे ज्यादा दानेदार परिभाषा से शुरू हो और अगर यह RPC या नियंत्रण प्रवाह की तरह दिखता है।
आरोहण

2

उदी का संदेश यह है कि CQRS केवल CRUD से अधिक है। मैंने यह रिकॉर्ड क्यों बनाया? मैं यह रिकॉर्ड क्यों बदल रहा हूं? इसे क्यों हटाया / मिटाया जा रहा है?

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.