इवेंट सोर्सिंग में प्रक्रिया प्रबंधक को कैसे लागू किया जाए


15

मैं 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...

जिन प्रश्नों का मुझे निश्चित उत्तर नहीं मिला, वे हैं:

  1. क्या मुझे प्रक्रिया प्रबंधक को बनाए रखने की आवश्यकता है? ऐसा लगता है जैसे मैं करता हूं, लेकिन मुझे यकीन नहीं है
  2. यदि मैं करता हूं, तो मुझे प्रक्रिया प्रबंधक के लिए घटनाओं को बचाने की आवश्यकता है। हालाँकि, जिन घटनाओं को यह सुन रहा है वे समुच्चय से बंधे हैं। क्या मैं उन लोगों के लिए प्रक्रिया आईडी जोड़ूँ? क्या मेरे पास प्रक्रिया प्रबंधक के लिए अलग-अलग ईवेंट हैं? यह कैसे करें और यथासंभव DRY रखें
  3. मुझे कैसे पता चलेगा कि ProductReservedईवेंट किस टोकरी के लिए हैं? यह BasketIdउन पर भी है, या यह है कि जानकारी लीक ठीक है?
  4. मैं घटनाओं के बीच कैसे संबंध रखता हूं, मुझे कैसे पता चलेगा कि ItemAddedकिस ProductReservedघटना का उत्पादन हुआ है ? क्या मैं एक साथ गुजरता हूं EventId? यह अजीब लगता है ...
  5. क्या मुझे Basketएक साधारण समुच्चय के बजाय एक प्रक्रिया प्रबंधक के रूप में लागू करना चाहिए ?

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

एक प्रोसेस मैनेजर बाहर की घटनाओं के साथ काम करता है और कमांड भेजता है। यह इतिहास उन घटनाओं से फिर से बनाया जा सकता है जो एग्रीगेट्स पर हुई हैं जो एक सहसंबंधी की तरह एक सामान्य पहचानकर्ता को साझा करती हैं।


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

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

जवाबों:


15

रिनाट अब्दुलिन ने व्यावसायिक प्रक्रिया को विकसित करने के बारे में क्या लिखा है, इसकी समीक्षा करें । विशेष रूप से, तेजी से बदलते परिवेश में एक व्यावसायिक प्रक्रिया विकसित करने के लिए उसकी सिफारिश पर ध्यान दें - एक प्रक्रिया प्रबंधक एक स्क्रीन पर घूर रहे इंसान के लिए एक स्वचालित प्रतिस्थापन "बस" है।

प्रोसेस मैनेजर का मेरा खुद का मानसिक मॉडल यह है कि यह एक ईवेंट सॉर्क्ड प्रोजेक्शन है जिसे आप लंबित कमांडों की सूची के लिए क्वेरी कर सकते हैं।

क्या मुझे प्रक्रिया प्रबंधक को बनाए रखने की आवश्यकता है? ऐसा लगता है जैसे मैं करता हूं, लेकिन मुझे यकीन नहीं है

यह एक पढ़ी हुई मॉडल है। जब भी आपको इसकी आवश्यकता हो, आप प्रत्येक बार घटनाओं के इतिहास से प्रक्रिया प्रबंधक का पुनर्निर्माण कर सकते हैं; या आप इसे स्नैपशॉट की तरह व्यवहार कर सकते हैं जिसे आप अपडेट करते हैं।

यदि मैं करता हूं, तो मुझे प्रक्रिया प्रबंधक के लिए घटनाओं को बचाने की आवश्यकता है।

नहीं - प्रक्रिया प्रबंधक एक प्रबंधक है । यह अपने आप में कुछ भी उपयोगी नहीं है; इसके बजाय यह समुच्चय को काम करने के लिए कहता है (यानी, रिकॉर्ड की पुस्तक में बदलाव करें)।

मुझे कैसे पता चलेगा कि ProductReserved इवेंट्स किस टोकरी के लिए हैं? क्या उन पर भी बास्केटआईड होना ठीक है, या वह लीक जानकारी है

ज़रूर। नोट: अधिकांश "वास्तविक" शॉपिंग डोमेन में, आप ऑर्डर देने से पहले इन्वेंट्री को संग्रहीत करने पर जोर नहीं देंगे; यह व्यवसाय के लिए अनावश्यक विवाद जोड़ता है। यह अधिक संभावना है कि आपका व्यवसाय आदेश को स्वीकार करना चाहेगा, फिर उस दुर्लभ मामले में माफी माँगता है जो आदेश आवश्यक समय में पूरा नहीं किया जा सकता है।

मैं घटनाओं के बीच एक संबंध कैसे रखूं, मुझे कैसे पता चलेगा कि किस ProductAdded ने किस उत्पाद का उत्पादन किया है?

संदेशों में मेटा डेटा होता है - विशेष रूप से, आप एक करणीय शामिल कर सकते हैं (इसलिए आप यह पहचान सकते हैं कि कौन से आदेशों का उत्पादन किया गया है) और सहसंबंधी व्यक्ति , आम तौर पर वार्तालाप को ट्रैक करने के लिए।

उदाहरण के लिए, प्रक्रिया प्रबंधक कमांड में सहसंबंधी आईडी के रूप में अपनी आईडी लिखता है; ईवेंट की प्रतिलिपि कमांड के सहसंबंध आईडी द्वारा निर्मित होती है, और आपका प्रोसेस मैनेजर उन सभी ईवेंट की सदस्यता लेता है, जिनका अपना स्वयं का सहसंबंध होता है।

क्या मुझे एक साधारण एग्रीगेट के बजाय एक प्रोसेस मैनेजर के रूप में बास्केट को लागू करना चाहिए?

मेरी सिफारिश नहीं है। लेकिन उदी दहन की एक अलग राय है जिसे आपको समीक्षा करनी चाहिए; यह है कि CQRS केवल तभी समझ में आता है जब आपके समुच्चय सागा होते हैं - उडी ने गाथा का उपयोग उस स्थान पर किया है जहाँ प्रक्रिया प्रबंधक प्रमुख वर्तनी बन गया है।

क्या प्रबंधकों को समुच्चय प्राप्त करने की प्रक्रिया करनी चाहिए?

ज़रुरी नहीं? प्रक्रिया प्रबंधक मुख्य रूप से ऑर्केस्ट्रेशन से संबंधित हैं, न कि डोमेन स्टेट से। एक प्रक्रिया के एक उदाहरण में "राज्य" होगा, उन सभी घटनाओं के इतिहास के रूप में जो उन्होंने देखी हैं - घटना Z के जवाब में करने के लिए सही चीज यह निर्भर करती है कि क्या हमने घटनाओं को देखा है X और Y तो आपको उस राज्य के एक प्रतिनिधित्व को संग्रहीत करने और लोड करने में सक्षम होने की आवश्यकता हो सकती है (जो कुछ सपाट हो सकता है, या मनाया गया इतिहास हो सकता है)।

(मैं कहता हूँ "वास्तव में नहीं" क्योंकि कुल अस्पष्ट पर्याप्त है कि यह पूरी तरह से गलत दावा करने के लिए मनाया घटनाओं की उस सूची में नहीं है परिभाषित किया गया है है एक "कुल" मतभेद कार्यान्वयन की तुलना में अधिक अर्थ हैं -। हम लोड प्रक्रिया राज्य और उसके बाद के लिए क्या संदेशों तय डोमेन राज्य के लिए ज़िम्मेदार सिस्टम के हिस्सों को भेजें । यहां हाथ लहराते हुए थोड़ा सा है।)

इसलिए पीएम को दूसरे पर एक प्रकार के राज्य प्रबंधन का उपयोग करने की आवश्यकता नहीं है, क्योंकि यह केवल सामान को लाइव करने के लिए जिम्मेदार है और रिप्ले के दौरान कभी नहीं?

काफी नहीं - राज्य प्रबंधन एक डी-एर नहीं है, यह कीपर ट्रैकर है। ऐसी परिस्थितियों में, जहां प्रक्रिया चरनी को किसी भी संकेत का उत्सर्जन नहीं करना चाहिए, आप इसे दुनिया को निष्क्रिय कनेक्शन देते हैं। दूसरे शब्दों में, dispatch(command)एक सेशन नहीं है।


1
आप कहते हैं: आप प्रक्रिया प्रबंधक को घटनाओं के इतिहास से हर बार आपको इसकी आवश्यकता के लिए पुनर्निर्माण कर सकते हैं ... लेकिन इसके पुनर्निर्माण के लिए, मुझे इसके लिए घटनाओं को बचाने की आवश्यकता है। या मुझे समुच्चय में होने वाली घटनाओं से इसका पुनर्निर्माण करना चाहिए? मैं जिस भाग के साथ संघर्ष कर रहा हूं वह है: एग्रीगेट्स के साथ, ईवेंट्स के पास कुल आईडी है, और उस एगलेट आईडी के साथ सभी घटनाओं को ढूंढकर पुनर्निर्माण करना आसान है। लेकिन प्रक्रिया प्रबंधक के लिए मैं ऐसा कैसे करूंगा? क्या मुझे प्रक्रिया प्रबंधक के लिए ऐसा करना चाहिए? या प्रक्रिया प्रबंधक को समुच्चय की तलाश करनी चाहिए, जब उसे किसी घटना के आधार पर कुछ तय करने की आवश्यकता हो?
इवान पिंटर

जो मुझे याद आ रहा था, वह इवेंट सोर्सिंग में करणीय और सहसंबंध की धारणा थी। एक बार जब मैंने उस पर गौर किया, तो चौथे सवाल के आपके जवाब ने आखिरकार समझदारी दी।
इवान पिंटर

1
मुझे @IvanPintar की पहली टिप्पणी का जवाब पसंद आएगा; क्या प्रक्रिया प्रबंधकों को समुच्चय प्राप्त करना चाहिए? क्या उन्हें इस प्रक्रिया के आधार पर अपना निर्माण करना चाहिए? उस स्थिति में यह घटना संचालकों को साइड-इफ़ेक्ट फ्री, सही होने की आवश्यकता होगी?
जेफ

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

दिलचस्प है, इसलिए यह डेवलपर के लिए अधिक या कम है जब तक कि प्रक्रिया प्रबंधक घटनाओं का जवाब देता है और अंत में आदेश भेजता है?
जेफ

3

आप जिस चीज़ की तलाश कर रहे हैं उसका एक "सागा" नामक एक पैटर्न है, जो अनिवार्य रूप से एक प्रक्रिया प्रबंधक है।

सागा की लंबी चलने वाली प्रक्रियाओं के लिए भी सही है, क्योंकि यह सहसंबद्ध आदेशों के बीच राज्य को बनाए रख सकता है।

यहाँ साग पर एक शानदार लेख है

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