5

हाय मैं निम्नलिखित senario जो मुझे समझ में कैसे साथ अंतिम स्थिरता प्राप्त करने के लिए न हो:डोमेन घटनाओं और संस्करण CQRS बिना

  1. उपयोगकर्ता 1 टास्क आधारित ui का उपयोग करता है ग्राहक का नाम बदलने के लिए
  2. अनुप्रयोग सेवा कॉल पर आपरेशन CUSTOMERNAME पर कुल
  3. सकल आग ईवेंट परिवर्तित
  4. बस nservicebus का उपयोग कर
  5. nServicebus सेवा मर संदेश भेजता है
  6. 012,उपयोगकर्ता 2 कुल हो जाता है और कॉल पता बदलने
  7. सकल संचालन बुलाया
  8. डोमेन गतिविधि सक्रिय
  9. संदेश बस में डाल
  10. बस पुन: प्रारंभ होता
  11. संदेश 2 उठाया पहले
  12. संदेश 2 संसाधित और अन्य घिरा नए पते के साथ अद्यतन संदर्भ
  13. संदेश 1 अब उठाया जो गलत क्रम
  14. क्या अब होताहै 0

यदि 13 में हम घटना में कुल संस्करण को पास करते हैं तो क्या आशावादी समरूपता त्रुटि होगी?

यदि ऐसा है तो संदेश 1 नया संदर्भ अन्य संदर्भ में ऑब्जेक्ट पर लागू हो जाता है। हम निरंतरता को कैसे बनाए रखते हैं?

यह वह मुद्दा है जो मुझे मेरे डोमेन में ईवेंट लागू करने से रोक रहा है। सभी मदद का स्वागत है।

आवश्यक विचार किसी अन्य संदर्भ में एक और समग्र को अद्यतन करना है। मैं बस इस तरह की सहमति प्रौद्योगिकी पर अटक गया हूँ।

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

ब्लेयर

उत्तर

3

आम तौर पर आप संदेशों को कतारबद्ध करेंगे। यदि वे एक कतार में जा रहे हैं तो आपको उचित आदेश मिल जाएगा। अगर आप ऐसा कुछ उपयोग करना चाहते हैं जो आपके सर्विसबस के साथ ऑर्डर करने का समर्थन नहीं करता है तो अपने ईवेंट में अनुक्रम संख्या जोड़ें ताकि दूसरी तरफ उन्हें ठीक से व्यवस्थित कर सकें। टीसीपी 1981 http://www.ietf.org/rfc/rfc793.txt से कर दिया गया है :)

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है। मैं nservicebus के माध्यम से घटना भेजता हूं इसलिए कोई ऑर्डर नहीं है। अगर मैं अपने कार्यक्रमों में अनुक्रम संख्या जोड़ता हूं तो मैं दूसरे छोर पर ऑर्डरिंग कैसे करूं? मुझे क्या याद आ रहा है वहां कुछ स्पष्ट होना चाहिए जो मैं नहीं देख रहा हूं। –

+0

कई थ्रेड के साथ NServicebus के साथ भी कोई गारंटी नहीं है कि उन्हें क्रमशः संसाधित किया जाएगा। –

+0

दूसरे छोर पर अनुक्रम संख्या का ट्रैक रखें। संदेश संसाधित न करें जब तक अनुक्रम संख्या 'अंतिम संसाधित अनुक्रम संख्या + 1' से मेल नहीं खाती। –

0

उफ़: मैं बस देखा है कि आप वास्तव में अपने उदाहरण (ग्राहक के नाम और उसके बाद ग्राहक का पता) में 2 विभिन्न कार्यों के लिए इस्तेमाल किया। बेशक यह एक गैर-मुद्दा होगा क्योंकि आदेश वास्तव में कोई फर्क नहीं पड़ता। लेकिन अगर मेरा इरादा दो प्रकार के परिवर्तन के लिए होता तो मैं अपना जवाब छोड़ दूंगा।

एक बात के लिए अपने उदाहरण के बाद से 2 उपयोगकर्ताओं एक ही समय में पता और प्रसंस्करण के आदेश को अपडेट कर सकता है विफल कि समाप्ति बिंदु की आवश्यकता नहीं है:

सवालों का हमेशा एक जोड़ी के रूप में/मुद्दों मन के लिए आते हैं यादृच्छिक हो सकता है। तो प्रश्न बन जाता है कि कौन सा सही पता है।तो को हल करना को थोड़ा अधिक विश्लेषण की आवश्यकता है। एक बात के लिए मुझे लगता है कि हम मान सकते हैं कि एक ग्राहक इतनी बार नहीं चलेगा कि 2 उपयोगकर्ता एक ही समय में पते को अपडेट कर रहे हैं (या इसके पास भी) --- :)

फिर भी, शायद पहला पता है सही वाला।

मैं ऐसे परिदृश्य आप चाहे संगामिति, या यहाँ तक कि कुछ अन्य सहिष्णुता की पहचान करना चाहते के लिए लगता है, एक मुद्दा है। तो हो सकता है कि एक पता दिन में केवल एक बार बदला जा सकता है और किसी अन्य बदलाव के लिए कुछ अन्य बातचीत की आवश्यकता होती है। तो कुछ अपवाद हैंडलिंग एक विकल्प होगा।

आप वास्तव में इस एक तकनीकी स्तर तक नीचे नहीं ले रही किया जाना चाहिए कोशिश करते हैं और इसे हल बल्कि प्रक्रिया/व्यापार निहितार्थ को देखने के लिए।

एक सरल उपाय मैं संदेश मिलान के साथ जाना होगा के लिए एक विशेष प्रकार के लिए पिछले आपरेशन तारीख करने के लिए तारीख भेजें। तो ChangeAddressCommand के लिए जब आप किसी संदेश को संसाधित करते हैं तो आप वर्तमान LastAddressChange से तुलना कर सकते हैं और यदि संदेश अंतिम परिवर्तन तिथि से पहले भेजा गया था तो उसे अस्वीकार कर दें।

0

NServiceBus साथ ऐसा ही एक issuee here चर्चा की है। ओपी अन्य संदेश आने तक स्पिन करने के लिए IBus.HandleCurrentMessageLater() के उपयोग का प्रस्ताव करता है। यह काम कर सकता है, लेकिन समस्याग्रस्त हो सकता है क्योंकि आप कभी नहीं जानते कि आपको कितनी देर प्रतीक्षा करनी है।

एक और अधिक शामिल विकल्प के लिए एक saga उपयोग करने के लिए जो जब तक सभी संदेशों एक विशेष संस्करण के लिए अग्रणी आ चुके हैं इंतजार करेंगे होगा। इस मामले में, अनुक्रमण संस्करण के आधार पर किया जाता है और केवल तभी संभव होता है जब कुल संस्करण में सभी परिवर्तन अन्य बीसी में प्रकाशित हो जाएं। मान लीजिए संदेश 1 कुल के संस्करण 2 पर संचालित है। यह तो यह कुल का संस्करण वृद्धि कर देता है और एक घटना यह बताते हुए प्रकाशित करता है संस्करण 2 संदेश 2 कुल का संस्करण 3 पर चल रही है पर संचालित किया है और एक घटना यह बताते हुए प्रकाशित करता है संस्करण 3. पर संचालित किया है जब अन्य ईसा पूर्व में NServiceBus endpoint संदेश 1 से पहले संदेश 2 प्राप्त करता है, यह जानता है कि अंतिम प्राप्त संदेश कुल के संस्करण 1 पर संचालित होता है, इसलिए इसे संस्करण 2 पर संचालित एक की आवश्यकता होती है। यह एक गाथा शुरू करेगा जो अगले संदेश की प्रतीक्षा कर रहा है। एक बार यह संदेश 1 प्राप्त करने के बाद, गाथा संदेश 1 और फिर संदेश 2 लागू करेगी और गाथा राज्य जारी करेगी। यदि अनुक्रमण के लिए संस्करण का उपयोग स्वीकार्य नहीं है, तो दूसरी अनुक्रम रणनीति का उपयोग किया जा सकता है।

0

this के अनुसार आप अपने आप से पूछना चाहिए:

एक विफलता होने के व्यापार के प्रभाव क्या है?

आपके वर्तमान मामले में, आपको एक बार लाखों अनुरोधों से यह समस्या है। मुझे नहीं लगता कि अगर आप दोनों अनुरोधों को मान्य मानते हैं तो इसका व्यापार पर बड़ा असर होगा।

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