मैं CQRS और इवेंट सोर्सिंग की अवधारणाओं को सीखने के लिए एक छोटे से उदाहरण के आवेदन पर काम कर रहा हूं। मेरे पास एक Basket
कुल और एक Product
कुल है जो स्वतंत्र रूप से काम करना चाहिए।
कार्यान्वयन को दिखाने के लिए यहां कुछ छद्म कोड दिए गए हैं
Basket { BasketId; OrderLines; Address; }
// basket events
BasketCreated { BasketId; }
ItemAdded { BasketId; ProductId; Quantity }
AddItemSucceeded { BasketId; ProductId; Quantity }
AddItemRevoked { BasketId; ProductId; Quantity }
ItemRemoved { BasketId; ProductId; Quantity }
CheckedOut { BasketId; Address }
Product { ProductId; Name; Price; }
// product events
ProductReserved { ProductId; Quantity }
ProductReservationFailed { ProductId; Quantity }
ProductReservationCancelled { ProductId; Quantity; }
कमांड सुंदर घटनाओं के समान हैं, अनिवार्य नाम का उपयोग करते हैं और तनावपूर्ण नहीं होते हैं।
अभी ये काम स्वतंत्र रूप से ठीक है। मैं एक कमांड जारी करता हूं AddItem
, और यह एग्रीगेट ItemAdded
पर एक ईवेंट बनाता है Basket
जो 'बास्केट' की स्थिति के साथ क्या करने की आवश्यकता है। इसी तरह, उत्पाद के लिए कमांड और इवेंट ठीक काम करते हैं।
अब मैं इसे एक ऐसी प्रक्रिया में जोड़ना चाहता हूं, जो कुछ इस तरह से हो (आदेशों और घटनाओं के संदर्भ में)
प्रक्रिया प्रबंधक निम्नलिखित कार्य करेगा:
on BasketCreated: CreateShoppingProcess
on ItemAdded: ReserveProduct
on ProductReserved: SucceedAddingItem // does nothing, but needs to be there so that the basket knows it can check out
on ProductReservationFailed: RevokeAddItem
on RemoveItem: CancelProductReservation
on Checkout: CreateOrder // create an order and so on...
जिन प्रश्नों का मुझे निश्चित उत्तर नहीं मिला, वे हैं:
- क्या मुझे प्रक्रिया प्रबंधक को बनाए रखने की आवश्यकता है? ऐसा लगता है जैसे मैं करता हूं, लेकिन मुझे यकीन नहीं है
- यदि मैं करता हूं, तो मुझे प्रक्रिया प्रबंधक के लिए घटनाओं को बचाने की आवश्यकता है। हालाँकि, जिन घटनाओं को यह सुन रहा है वे समुच्चय से बंधे हैं। क्या मैं उन लोगों के लिए प्रक्रिया आईडी जोड़ूँ? क्या मेरे पास प्रक्रिया प्रबंधक के लिए अलग-अलग ईवेंट हैं? यह कैसे करें और यथासंभव DRY रखें
- मुझे कैसे पता चलेगा कि
ProductReserved
ईवेंट किस टोकरी के लिए हैं? यहBasketId
उन पर भी है, या यह है कि जानकारी लीक ठीक है? - मैं घटनाओं के बीच कैसे संबंध रखता हूं, मुझे कैसे पता चलेगा कि
ItemAdded
किसProductReserved
घटना का उत्पादन हुआ है ? क्या मैं एक साथ गुजरता हूंEventId
? यह अजीब लगता है ... - क्या मुझे
Basket
एक साधारण समुच्चय के बजाय एक प्रक्रिया प्रबंधक के रूप में लागू करना चाहिए ?
कुछ और शोध के बाद मैं इस पर आया: एक गाथा एक ऐसी चीज है जो अपनी घटनाओं को रखती है और बाहर की घटनाओं को सुनती है। असल में, यह एक एग्रीगेट है जो बाहर की घटनाओं के बारे में भी प्रतिक्रिया दे सकता है क्योंकि यह अपनी छोटी दुनिया है।
एक प्रोसेस मैनेजर बाहर की घटनाओं के साथ काम करता है और कमांड भेजता है। यह इतिहास उन घटनाओं से फिर से बनाया जा सकता है जो एग्रीगेट्स पर हुई हैं जो एक सहसंबंधी की तरह एक सामान्य पहचानकर्ता को साझा करती हैं।