2016-06-24 9 views
8

मैं लगभग CQRS+EventSoucing पैटर्न (जिसे मैं निकट भविष्य में लागू करना चाहता हूं) पढ़ रहा हूं और मुझे मिले सभी डेक और प्रस्तुतियों के लिए एक बिंदु आम है ताकि आपके मॉडल स्थिति को पुनर्स्थापित करने के लिए स्नैपशॉट ले सकें। यह, लेकिन ऐसा करने के इन शेयर पैटर्न/रणनीतियों में से कोई भी नहीं।स्नैपशॉट रणनीतियों को लेना और पुनर्स्थापित करना

मुझे आश्चर्य है कि आप विशेष रूप से करने के मामले में अपने विचारों और इस मामले में अनुभव को साझा कर सकता है:

  • जब
  • स्नैपशॉट के लिए एक स्नैपशॉट दुकान मॉडल करने के लिए कैसे
  • आवेदन/कैश ठंड
  • शुरू

टीएल; डीआर: आपने को अपने CQRS+EventSourcing एप्लिकेशन में कैसे कार्यान्वित किया है? फायदा और नुकसान?

उत्तर

6

कुछ उदाहरण हैं जिन्हें आपको निश्चित रूप से स्नैपशॉट करने की आवश्यकता है। लेकिन एक जोड़े हैं - एक आम उदाहरण एक खाता में एक खाता है। आपके पास खाते के अंतिम BALANCE राज्य का उत्पादन करने वाले हजारों क्रेडिट/डेबिट कार्यक्रम होंगे - यह हर बार स्नैपशॉट न करने के लिए पागल होगा।

मेरे दृष्टिकोण snapshoting जब मैं तैयार किया गया Aggregates.NET अपने डिफ़ॉल्ट रूप से बंद करने और अपने समुच्चय या संस्थाओं को सक्षम करने के लिए था AggregateWithMemento या EntityWithMemento जिसमें बारी अपने इकाई एक RestoreSnapshot, एक TakeSnapshot और एक ShouldTakeSnapshot

को परिभाषित करना होगा से विरासत चाहिए निर्णय लें कि स्नैपशॉट लेना है या नहीं, इकाई को ही छोड़ दिया गया है। एक आम पैटर्न

Boolean ShouldTakeSnapshot() { 
    return this.Version % 50 == 0; 
} 

कौन सा कोर्स हर 50 घटनाओं में स्नैपशॉट लेगा।

इकाई स्ट्रीम पढ़ने पर पहली चीज हम स्नैपशॉट की जांच करते हैं तो स्नैपशॉट लेने के पल से बाकी इकाई की स्ट्रीम पढ़ें। आईई: पूरी धारा के लिए केवल उस हिस्से को न पूछें जिसे हमने स्नैपशॉट नहीं किया है।

स्टोर के लिए - आप सचमुच कुछ भी उपयोग कर सकते हैं। वीओयू सही है क्योंकि एक कुंजी-मूल्य स्टोर सबसे अच्छा है क्योंकि आपको केवल 1 की आवश्यकता है। जांचें कि कोई मौजूद है या नहीं 2. पूरी चीज लोड करें - जो केवी

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

मुझे लगता है कि आप कैशिंग और ठंड शुरू होने की इस बात के साथ बहुत अधिक अनुकूलित करने की कोशिश कर रहे हैं।

4
  • नियम # 1: नहीं।
  • नियम # 2: मत करो।

एक कार्यक्रम सोर्स मॉडल को स्नैपशॉट करना एक प्रदर्शन अनुकूलन है। प्रदर्शन अनुकूलन का पहला नियम? मत करो।

विशेष रूप से, स्नैपशॉटिंग आपके ईवेंट स्टोर से आपके मॉडल के इतिहास को पुनः लोड करने का प्रयास करने वाले आपके भंडार में खोने वाले समय की मात्रा को कम कर देता है।

यदि आपका संग्रह मॉडल को स्मृति में रख सकता है, तो आप इसे अक्सर पुनः लोड नहीं करेंगे। तो स्नैपशॉटिंग से जीत छोटी होगी। इसलिए: मत करो।

यदि आप अपने मॉडल को aggregates में विघटित कर सकते हैं, तो यह कहने के लिए कि आप अपने मॉडल के इतिहास को गैर-ओवरलैपिंग इतिहास वाले कई इकाइयों में विघटित कर सकते हैं, तो आपका एक मॉडल लंबा मॉडल इतिहास कई छोटे इतिहास बन जाता है कि प्रत्येक एक इकाई में परिवर्तन का वर्णन करता है। प्रत्येक इकाई इतिहास जिसे आपको लोड करने की आवश्यकता है वह बहुत छोटा होगा, इसलिए स्नैपशॉट से जीत कम होगी। इसलिए: मत करो।

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

आप एक लिखने SLA जब भंडार स्मृति कैश ठंडे हैं लापता के बारे में चिंतित हैं, और आप की घटनाओं को फिर से लोड करने के लिए की बहुत सारी के साथ लंबे समय मॉडल इतिहास है। स्नैपशॉटिंग पर बोल्टिंग छोटे मॉडल में अपने मॉडल इतिहास को दोबारा करने की कोशिश करने से कहीं अधिक उचित हो सकती है। ठीक है ....

स्नैपशॉट स्टोर पढ़ा गया मॉडल - किसी भी समय, आप मॉडल को उड़ाने और ईवेंट स्टोर में बने इतिहास से इसे पुनर्निर्माण करने में सक्षम होना चाहिए।

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

सेवा प्रदाता इंटरफ़ेस की तरह

interface SnapshotClient { 
    SnapshotRecord getSnapshot(Identifier id) 
} 

SnapshotRecord भंडार करने के लिए जानकारी स्नैपशॉट का उपभोग करने की जरूरत है प्रदान करने के लिए जा रहा है कुछ देखने के लिए जा रहा है। यही कारण है कि एक न्यूनतम

  1. एक स्मृति चिन्ह कि भंडार snapshotted राज्य
  2. स्नैपशॉट प्रोजेक्टर द्वारा संसाधित जब स्नैपशॉट निर्माण पिछले घटना का विवरण दिया गया rehydrate करने के लिए अनुमति देता है पर शामिल करने के लिए जा रहा है।

मॉडल तो फिर से हाइड्रेट स्मृति चिन्ह से snapshotted राज्य, इतिहास घटना की दुकान, स्कैनिंग पीछे की ओर से लोड होगा (यानी, सबसे हाल ही में घटना से शुरू) घटना SnapshotRecord में दस्तावेज की तलाश में , फिर क्रम में आगामी घटनाओं को लागू करें।

SnapshotRepository ही (किसी भी आईडी के लिए सबसे अधिक एक रिकॉर्ड पर) मुख्य-मान की दुकान हो सकता है, लेकिन ब्लॉब समर्थन के साथ एक संबंधपरक डेटाबेस भी ठीक

select * 
from snapshots s 
where id = ? 
order by s.total_events desc 
limit 1 

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

तंग युग्मन का यह भी अर्थ है कि आपको विशेष रूप से स्मारक के बारे में चिंता करने की आवश्यकता नहीं है; एक बाइट सरणी ठीक हो जाएगी।

हालांकि, उन्हें अपने पिछले अवतारों से सहमत होने की आवश्यकता नहीं है। स्नैपशॉट प्रोजेक्टर 2.0 स्नैपशॉट प्रोजेक्टर 1.0 द्वारा छोड़े गए किसी भी स्नैपशॉट को अनदेखा/अनदेखा करता है - स्नैपशॉट स्टोर केवल एक कैश है।

मैं एक ऐसा एप्लिकेशन तैयार कर रहा हूं जो संभवतः एक दिन में लाखों घटनाएं उत्पन्न करेगा। हम अगर हम एक दृश्य के 6 महीने के पुनर्निर्माण की जरूरत बाद में

अधिक सम्मोहक जवाब यहां से एक समय स्पष्ट रूप से मॉडल करने के लिए है क्या कर सकते हैं। क्या आपके पास एक इकाई है जो छह महीने तक रहती है, या क्या आपके पास 180+ इकाइयां हैं जो प्रत्येक एक दिन के लिए जीती हैं? लेखांकन यहां संदर्भित करने के लिए एक अच्छा डोमेन है: वित्तीय वर्ष के अंत में, किताबें बंद हैं, और अगले वर्ष की किताबें कैरियोवर के साथ खोली जाती हैं।

Yves Reynhout अक्सर मॉडलिंग समय और शेड्यूलिंग के बारे में बात करता है; Evolving a Model एक अच्छा प्रारंभिक बिंदु हो सकता है।

+0

आज जिस तरह के सिस्टम मैं काम कर रहा हूं, उसके लिए उच्च प्रदर्शन की आवश्यकता है लेकिन 24x7 उपलब्धता नहीं है। तो ऐसी परिस्थिति में जहां मैंने रखरखाव के लिए अपना सिस्टम बंद कर दिया है और इसे पुनरारंभ करना है, मुझे अपने सभी ईवेंट स्टोर को लोड और पुन: प्रसंस्करण करना होगा क्योंकि मेरी ताजा प्रणाली घटनाओं को संसाधित करने के लिए कौन सी कुल आईडी नहीं जानता है। मुझे अपने सिस्टम को फिर से शुरू करने के लिए एक बेहतर प्रारंभिक बिंदु की आवश्यकता है। – Mikhas

+0

और यदि आप सभी इतिहास नहीं रखते हैं तो क्या होगा? असल में मैं एक ऐसा एप्लीकेशन तैयार कर रहा हूं जो संभवतः एक दिन में लाखों घटनाएं उत्पन्न करेगा। अगर हमें 6 महीने बाद एक दृश्य पुनर्निर्माण की ज़रूरत है तो हम क्या कर सकते हैं? क्या आप कुछ सलाह दे सकते हैं? –

+0

संपादन देखें, और रेनहाउट द्वारा बात करें। – VoiceOfUnreason

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