इवेंट सोर्सिंग में मैं साइड इफेक्ट्स से कैसे निपटूं?


14

मान लेते हैं कि हम एक वित्तीय अनुप्रयोग के लिए एक छोटा सुरक्षा सबसिस्टम लागू करना चाहते हैं जो एक अजीब पैटर्न का पता चलने पर उपयोगकर्ताओं को ईमेल के माध्यम से चेतावनी देता है। इस उदाहरण के लिए, पैटर्न तीन लेनदेन में शामिल होगा जैसा कि दर्शाया गया है। सुरक्षा उपतंत्र मुख्य प्रणाली से एक कतार से घटनाओं को पढ़ सकता है।

मैं जो प्राप्त करना चाहूंगा वह एक चेतावनी है जो सिस्टम में होने वाली घटनाओं का एक सीधा परिणाम है, बिना मध्यवर्ती प्रतिनिधित्व के जो पैटर्न की वर्तमान स्थिति को मॉडल करता है।

  1. निगरानी सक्रिय
  2. लेन-देन की प्रक्रिया
  3. लेन-देन की प्रक्रिया
  4. लेन-देन की प्रक्रिया
  5. अलर्ट ट्रिगर (आईडी: 123)
  6. भेजे गए अलर्ट के लिए ईमेल (आईडी के लिए: 123)
  7. लेन-देन की प्रक्रिया

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

कुछ हद तक, मैं उस ईमेल को देखता हूं जिसे क्वेरी पक्ष द्वारा उत्पन्न मटेरियल के समान भेजा जाना है जिसे मैंने CQRS / इवेंट सोर्सिंग साहित्य में कई बार देखा है, हालांकि इतना सूक्ष्म अंतर नहीं है।

इस साहित्य में, क्वेरी साइड ईवेंट हैंडलर से बनाई गई है जो किसी दिए गए बिंदु पर सभी घटनाओं को फिर से पढ़ने पर राज्य का एक भौतिककरण उत्पन्न कर सकता है। इस मामले में, हालांकि, उस तरह से पूरा नहीं किया जा सकता है, जो पहले बताए गए कारणों के लिए किया गया हो। यह विचार कि हर राज्य क्षणिक है, यहाँ इतनी अच्छी तरह से लागू नहीं होता है । हमें इस तथ्य को दर्ज करने की आवश्यकता है कि कहीं अलर्ट भेजा गया था।

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

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

  • क्या मेरा दृष्टिकोण सही है?
  • क्या कोई ऐसी जगह है जहाँ मुझे इस बारे में अधिक जानकारी मिल सकती है?

यह अजीब है कि मैं इस बारे में अधिक जानकारी नहीं पा सका हूं। शायद मैं गलत शब्द का इस्तेमाल कर रहा हूं।

आपको बहुत - बहुत धन्यवाद!

जवाबों:


12

इवेंट सोर्सिंग में मैं साइड इफेक्ट्स से कैसे निपटूं?

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

इसका मतलब यह है कि ईमेल को लेनदेन के बाहर भेजा जाता है जो इवेंट स्ट्रीम को अपडेट करता है।

ठीक है, जहां, बाहर, स्वाद का मामला है।

तो वैचारिक रूप से, आपके पास घटनाओं की एक धारा है जैसे

EmailPrepared(id:123)
EmailPrepared(id:456)
EmailPrepared(id:789)
EmailDelivered(id:456)
EmailDelivered(id:789)

और इस धारा से आप एक गुना बना सकते हैं

{
    deliveredMail : [ 456, 789 ],
    undeliveredMail : [123]
}

तह बताता है कि कौन से ईमेल स्वीकार नहीं किए गए हैं, इसलिए आप उन्हें फिर से भेजें:

undeliveredMail.each ( mail -> {
    send(mail);
    dispatch( new EmailDelivered.from(mail) );
}     

प्रभावी रूप से, यह एक दो चरण की प्रतिबद्धता है: आप वास्तविक दुनिया में एसएमटीपी को संशोधित कर रहे हैं, और फिर आप मॉडल को अपडेट कर रहे हैं।

ऊपर दिया गया पैटर्न आपको कम से कम-एक बार डिलीवरी मॉडल देता है। यदि आप सबसे अधिक-एक बार चाहते हैं, तो आप इसे घुमा सकते हैं

undeliveredMail.each ( mail -> {
    commit( new EmailDelivered.from(mail) );
    send(mail);
}     

EmailPrepared को टिकाऊ बनाने और वास्तव में ईमेल भेजने के बीच एक लेनदेन अवरोध है। ईमेल भेजने और EmailDelivered को टिकाऊ बनाने के बीच एक लेनदेन अवरोध भी है।

वितरित लेनदेन के साथ उदी दहन की विश्वसनीय मैसेजिंग एक अच्छा शुरुआती बिंदु हो सकता है।


2

आपको 'एक्ट्स' से 'स्टेट चेंज इवेंट्स' को अलग करना होगा।

एक राज्य परिवर्तन घटना एक घटना है जो वस्तु की स्थिति को बदल देती है। ये वे हैं जिन्हें आप स्टोर करते हैं और फिर से खेलना करते हैं।

एक कार्रवाई कुछ वस्तु अन्य बातों के लिए करता है। इन्हें इवेंट सोर्सिंग के भाग के रूप में संग्रहीत नहीं किया जाता है।

ऐसा करने का एक तरीका ईवेंट हैंडर्स के साथ है, जिसे आप वायर करते हैं या नहीं, इस पर निर्भर करता है कि आप एक्शन को चलाना चाहते हैं या नहीं।

public class Monitor
{
    public EventHander SoundAlarm;
    public void MonitorEvent(Event e)
    {
        this.eventcount ++;
        if(this.eventcount > 10)
        {
             this.state = "ALARM!";
             if(SoundAlarm != null) { SoundAlarm();}
        }
    }
}

अब मेरी निगरानी सेवा में मैं हो सकता है

public void MonitorServer()
{
    var m = new Monitor(events); //11 events
    //alarm has not been sounded because the event handler wasn't wired up
    //but the internal state is correctly set to "ALARM!"
    m.SoundAlarm += this.SendAlarmEmail;
    m.MonitorEvent(e); //email is sent
}

यदि आपको भेजे गए ईमेल को लॉग इन करने की आवश्यकता है, तो आप SendAlarmEmail के भाग के रूप में ऐसा कर सकते हैं। लेकिन वे इवेंट सोर्सिंग के अर्थ में इवेंट नहीं हैं

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