2012-05-14 12 views
13

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

यहाँ कुछ विचार है:

  1. विचारों/खुद को एक घटना की दुकान के बारे में परवाह नहीं है denormalizers। वे सिर्फ डोमेन से घटनाओं को संभालते हैं।
  2. ईवेंट स्टोर को पढ़ने के पक्ष में स्थानांतरित करना अभी भी आपको ईवेंट इतिहास/ऑडिट
  3. देता है फिर भी आप ईवेंट स्टोर से अपने विचारों को पुन: उत्पन्न कर सकते हैं। सिवाय इसके कि इसे एक लेखन मॉडल रिसाव की आवश्यकता नहीं है। उसे मॉडल नागरिकता पढ़ो!

यहां लिखने के पक्ष में रखने के लिए एक तकनीकी तर्क प्रतीत होता है। ग्रेग यंग से http://codebetter.com/gregyoung/2010/02/20/why-use-event-sourcing/:

हालांकि कुछ ऐसे मुद्दे हैं जो वर्तमान स्थिति का स्नैपशॉट संग्रहीत करने वाले कुछ का उपयोग करने के साथ मौजूद हैं। सबसे बड़ी समस्या इस तथ्य के आसपास घूमती है कि आपने अपने डेटा में दो मॉडल पेश किए हैं। आपके पास एक ईवेंट मॉडल और वर्तमान स्थिति का प्रतिनिधित्व करने वाला एक मॉडल है।

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

और स्नैपशॉट लेने के बाद, स्नैपशॉट से पहले की घटनाएं लिखने के परिप्रेक्ष्य से 100% बेकार हो जाती हैं, सिवाय इसके कि ... पढ़ने के पक्ष को पुनर्निर्माण करने के लिए! यह गलत लगता है।

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

फिर रखरखाव है। पुनर्निर्माण विचारों को ईवेंट स्टोर से जुड़ी एक प्रक्रिया की आवश्यकता होती है। तो अब आप जो भी व्यू रखरखाव कार्य लिखते हैं वह आपके लिखने वाले मॉडल को इवेंट स्टोर का उपयोग करने के लिए बाध्य करता है .. हमेशा के लिए।

सीक्यूआरएस का पूरा बिंदु नहीं है कि पढ़ने के मॉडल और लेखन मॉडल के आसपास उपयोग के मामले मौलिक रूप से असंगत हैं? तो हमें लिखने की तरफ पढ़ने के मॉडल को क्यों लाना चाहिए, लचीलापन और प्रदर्शन का त्याग करना चाहिए, और उन्हें दोबारा जोड़ना चाहिए। समय क्यों व्यतीत करें?

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

तो क्या कोई मुझे लिखने के पक्ष में रखने के लिए एक या अधिक आकर्षक कारणों को समझा सकता है? या वैकल्पिक रूप से, इसे रखरखाव/रिपोर्टिंग चिंता के रूप में पढ़ने के पक्ष में क्यों नहीं जाना चाहिए? फिर, मैं दुकान की उपयोगिता पर सवाल नहीं उठा रहा हूं। बस इसे कहाँ जाना चाहिए :)

+2

घटनाओं के साथ स्नैपशॉटिंग भी "नई अवधारणा" नहीं है, यह 2006 में सोर्सिंग की घटना पर मेरी पहली बात थी :) –

उत्तर

4

मुझे लगता है कि यह वास्तव में एक उत्कृष्ट सवाल है। घटनाओं के अनुक्रम के रूप में अपना कुल उपचार करना लिखने के पक्ष में अपने अधिकार में उपयोगी है, कमांड रीट्रीज़ बनाना और आसान बनाना। लेकिन मैं मानता हूं कि यह आपकी घटनाओं को बनाने के लिए काम करने से परेशान प्रतीत होता है, फिर यदि आपको इस स्नैपशॉटिंग प्रदर्शन में सुधार की आवश्यकता है तो दृढ़ता के लिए अपने ऑब्जेक्ट का एक और मॉडल बनाना होगा।

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

लेकिन फिर आपके पास तीन परिभाषाएं नहीं हैं? आपके समेकन को बनाए रखने के लिए, एक राज्य परिवर्तनों को संप्रेषित करने के लिए, और प्रश्नों के उत्तर देने के लिए कोई और संख्या?

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

+0

इसके लिए धन्यवाद। इसने परिभाषाओं की संख्या में वृद्धि नहीं की है। याद रखें कि ईवेंट सोर्सिंग + स्नैपशॉटिंग के साथ, आपके पास वास्तव में 2 में 1 बनाया गया है। इसलिए आपके पास समेकन के लिए इवेंटस्टोर + स्नैपशॉट, रीड मॉडलों के लिए ईवेंट और रीड रीजन के लिए इवेंटस्टोर है। दूसरी तरफ समेकन के लिए स्नैपशॉट, पढ़ने के मॉडल के लिए घटनाक्रम, और रीड रीजन के लिए इवेंटस्टोर है। इवेंटस्टोर + स्नैपशॉट स्प्लिट के साथ ही यह वही है। –

+0

क्या आप "कमांड रीट्रीज़ और आसान आसान" टिप्पणी पर विस्तार कर सकते हैं? यानी इसके लिए क्या आसान है जब लेखन पक्ष घटनाओं बना रहता है? –

+0

इसके अलावा, अपने अंतिम बिंदु पर, आइए मान लें कि आप अभी भी डिज़ाइन द्वारा समेकित क्वेरी करने में सक्षम नहीं होंगे। आईएमओ इवेंट स्टोर की पसंद इस डिजाइन के फैसले को प्रभावित नहीं करती है। आपकी प्रतिक्रिया के लिए फिर से धन्यवाद। –

0

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

+0

क्या आप एक उदाहरण दे सकते हैं? एक घटना स्टोर के बिना Concurrency किया जा सकता है और हमेशा संभाला जा सकता है। लेकिन मुझे "घटनाओं की तुलना" से बिल्कुल मतलब है, क्योंकि ऐसा कुछ ऐसा लगता है जो घटनाओं को संग्रहीत किए बिना संभाला नहीं जा सका। क्या कोई स्मार्ट रिज़ॉल्यूशन है जो आप घटनाओं के साथ व्यावहारिक रूप से कार्यान्वित कर सकते हैं? –

+0

@ जेरेमीरोसेनबर्ग मुझे लगता है कि रोमनब यहां क्या प्राप्त कर रहा है, प्रत्येक कार्यक्रम को आम तौर पर "संस्करण" संपत्ति को बनाए रखना चाहिए जो उस कुल के वर्तमान संस्करण को इंगित करता है। तो लिखने के पक्ष में, घटना वास्तव में प्रतिबद्ध होने से पहले आप * संस्करण * बनाम * वास्तविक * कुल संस्करण (यानी स्ट्रीम में अंतिम घटना संस्करण) के समग्र संस्करण के आधार पर आशावादी समेकन जांच कर सकते हैं। यह दृष्टिकोण एक वितरित प्रणाली में मुद्दों को हल करता है जिससे आपका कुल डाक हो सकता है यानी घटनाओं के बीच में किया गया है। – James

10

यह एक लंबा मृत प्रश्न है जिसने मुझे इंगित किया है। लेखन के पक्ष में घटनाओं को स्टोर करना बेहतर क्यों है इसके कुछ कारण हैं।

मेरी समझ से आर्किटेक्चर के बारे में आप बात कर रहे हैं एक बहुत आम है जो मैं देखता हूं ... असफल। हम अपने डोमेन मॉडल को एक रिलेशनल डेटाबेस में स्टोर करेंगे और फिर ईवेंट डालेंगे। आप ईवेंट की दुकान में पढ़ने की तरफ घटनाओं को सहेजने की मोड़ जोड़ते हैं। यह संभवतः एक गड़बड़ी का कारण बन जाएगा।

आपके द्वारा चलाए जाने वाले पहले अंक में आपकी घटनाओं के प्रकाशन में है। क्या होता है जब मैं डेटाबेस में सहेजता हूं और एमएसएमक्यू (मैं बीच में मर जाता हूं) कहने के लिए प्रकाशित होता हूं। तो डीटीसी उनके बीच पेश हो जाता है। इसमें लाने के लिए एक बड़ी बात है, वितरित लेनदेन को प्लेग की तरह टालना चाहिए। यह भी काफी अक्षम है क्योंकि मैं शायद डेटा को दो बार टिकाऊ बना रहा हूं (एक बार डाटाबेस में कतारबद्ध करने के लिए)। यह बहुत से सिस्टम थ्रुपुट को सीमित करेगा (200-300 संदेशों/सेकंड के डीटीसी बेंचमार्क आम हैं, घटनाओं के साथ केवल 20-30k/सेकेंड आम है)।

कुछ डेटाबेस अपने डेटाबेस में एक टेबल डालकर डीटीसी की आवश्यकता के आसपास काम करते हैं जिसमें घटनाएं होती हैं और कतार के रूप में कार्य करती हैं। यह डीटीसी की आवश्यकता से बच जाएगा हालांकि यह अभी भी अगले अंक में चलेगा।

आपके पास बग होने पर क्या होता है? मुझे पता है कि आप कभी भी बग्गी कोड नहीं लिखेंगे लेकिन बाद में परियोजनाओं के साथ काम कर रहे जूनियर/रखरखाव डेवलपर्स में से एक। एक उदाहरण के रूप में क्या होता है जब डोमेन ऑब्जेक्ट बदल जाता है और उठाया गया ईवेंट मेल नहीं खाता है? मान लें कि आप अपने डोमेन ऑब्जेक्ट पर "LA" (हार्डकोडेड) पर राज्य सेट करते हैं लेकिन आप ईवेंट पर cmd.State ("CT") पर स्थिति को सही तरीके से सेट करते हैं।

आप ऐसी त्रुटियों का पता कैसे लगाएंगे? चर्चा की जा रही सबसे बड़ी समस्या यह है कि अब "सच्चाई" के दो स्रोत हैं, लेखन पक्ष पर डेटाबेस और घटना स्ट्रीम आ रही है। साबित करने का कोई तरीका नहीं है कि वे बराबर हैं। यह लाइन के नीचे अजीब कीड़े के सभी प्रकार का कारण बन जाएगा।

+2

सत्य ** का ** एकल स्रोत होने का तर्क ** सोर्सिंग (आईएमओ) का मुख्य बिंदु है और जो आपको लिखने के पक्ष में ईवेंट स्टोर रखने के लिए मजबूर करता है। –