तो मुझे क्या याद आ रही है?
अंदाजा लगाना।
पहली चीज जो आपको याद आ रही है वह यह है कि आपको केवल उन राज्यों के लिए घटनाओं को फिर से लोड करना होगा जिन्हें आप पुनर्निर्माण कर रहे हैं। यदि आप अपनी लेन-देन की सीमाओं को साफ-सुथरे तरीके से मॉडल कर सकते हैं, तो प्रत्येक ऑब्जेक्ट अपनी आईडी से टैग की गई घटनाओं को लिख सकता है, और फिर केवल उन घटनाओं में वापस पढ़ सकता है। ईवेंट संग्रहण के लिए एक रिलेशनल डेटाबेस का उपयोग करते हुए, उस क्वेरी को गति देने के लिए एक अनुक्रमित आईडी कॉलम होगा। EventStore का उपयोग करते हुए, प्रत्येक ऑब्जेक्ट की अपनी स्ट्रीम होगी।
अपने मॉडल में इसे साफ-सुथरा ढंग से करने के लिए कुछ सावधानी बरती जाती है, जैसा कि आप सुनिश्चित करना चाहते हैं कि आप प्रत्येक लेनदेन में केवल एक ही वस्तु को संशोधित कर रहे हैं, और इसलिए आपको कुछ ध्यान रखने की जरूरत है कि आप प्रत्येक आक्रमणकारी को सही ढंग से अलग कर रहे हैं जिसे आप करने की कोशिश कर रहे हैं लागू करते हैं।
ऐसे मामलों में जहां यह काफी तेज नहीं है, फिर भी आपके पास अपने राज्य के स्नैपशॉट बनाने (मेमोलाइजेशन), और "पारंपरिक भंडारण" में बने रहने की संभावना है। प्रत्येक स्नैपशॉट को स्नैपशॉट बनाने के लिए उपयोग किए जाने वाले अंतिम ईवेंट की अनुक्रम संख्या के साथ टैग किया जाता है; पुनः लोड करने पर, रिपॉजिटरी पकड़ लेता है जो पहले स्नैपशॉट करता है, फिर उस पर नए ईवेंट लागू करता है। (यह हाल ही के स्नैपशॉट्स को हथियाने के लिए कुछ उचित तरीके का अर्थ है - या तो घटनाओं को अनुक्रम संख्या के साथ टैग किया गया है, या आपके पास अपने प्रारंभिक बिंदु तक पहुंचने तक घटना स्ट्रीम को पढ़ने के लिए कुछ कुशल तरीका है।)
यहां अभी भी सामान्य दृष्टिकोण पर एक फायदा है, यह कि आपके स्नैपशॉट आपके लेखन के समानांतर में बनाए जा सकते हैं, बल्कि उनके साथ विलय होने के बजाय: आप किसी इवेंट श्रोता को किसी अन्य थ्रेड / प्रक्रिया में डालते हैं, और इसे लिखने के साथ ही पूरा करते हैं स्नैपशॉट स्टोर पर जो भी शेड्यूल उचित लगता है। आखिरकार, स्नैपशॉट को विशेष रूप से समय पर होने की आवश्यकता नहीं है - बस अक्सर पर्याप्त होता है कि नई घटनाओं को फिर से लागू करने का काम आपके एसएलए को उड़ा नहीं देता है।
(स्नैपशॉट को माइग्रेट करने में कठिनाई होती है। मॉडल के क्रमांकन में कोई भी बदलाव स्नैपशॉट कैश को अमान्य कर देगा। बेशक, आप माइग्रेशन के हिस्से के रूप में नए क्रमांकन का उपयोग करके स्नैपशॉट का पुनर्निर्माण कर सकते हैं, और फिर परिवर्तन को लाइव होने पर "पकड़" सकते हैं।)
क्या घटना की स्थिति से राज्य बहाल करना आमतौर पर भी किया जाता है?
हाँ यही है। CQRS के उदाहरणों में सामान्य रूप से जो दिखाया गया है, वह यह है कि एप्लीकेशन लेयर, यह सुनिश्चित करने के बाद कि सबमिट कमांड अच्छी तरह से बनाई गई है, एप्लिकेशन लेयर डोमेन ऑब्जेक्ट को रिपॉजिटरी से लोड करेगा, जहां लोड एक डिफॉल्ट कंस्ट्रक्टर है, जिसके बाद इवेंट स्ट्रीम का रिप्ले होता है (या समकक्ष, घटनाओं की एक सूची के साथ एक कारखाने के लिए एक कॉल)।
दो अन्य, विरोधाभासी विचार।
- रिपॉजिटरी इंटरफेस के पीछे कैश हो सकता है
- कैश अमान्यकरण दो कठिन समस्याओं में से एक है।