एक मॉडल को नियंत्रित करने वाली सेवा A (CMS) को देखते हुए (उत्पाद, चलो मान लेते हैं कि यह आईडी, शीर्षक, मूल्य) और सेवाएं B (शिपिंग) और C (ईमेल) हैं, जिन्हें दिए गए मॉडल को प्रदर्शित करना है कि दृष्टिकोण क्या होना चाहिए इवेंट सोर्सिंग दृष्टिकोण में उन सेवाओं में दी गई मॉडल जानकारी को सिंक्रनाइज़ करने के लिए? चलो मान लेते हैं कि उत्पाद सूची शायद ही कभी बदलती है (लेकिन परिवर्तन होता है) और यह कि वहाँ प्रवेश हैं जो बहुत बार शिपमेंट और ईमेल के डेटा का उपयोग कर सकते हैं (उदाहरण के प्रकार हैं: बी: display titles of products the order contained
और सी display content of email about shipping that is going to be sent
:)। प्रत्येक सेवाओं का अपना डीबी है।
समाधान 1
घटना के भीतर उत्पाद के बारे में सभी आवश्यक जानकारी भेजें - इसका मतलब निम्नलिखित संरचना है order_placed
:
{
order_id: [guid],
product: {
id: [guid],
title: 'Foo',
price: 1000
}
}
सेवा पर बी और सी उत्पाद जानकारी मेज product
पर JSON विशेषता में संग्रहीत की जाती हैorders
जैसे, आवश्यक जानकारी प्रदर्शित करने के लिए केवल घटना से प्राप्त डेटा का उपयोग किया जाता है
समस्याएं : बी और सी में कौन सी अन्य जानकारी प्रस्तुत करने की आवश्यकता पर निर्भर करता है, घटना में डेटा की मात्रा बढ़ सकती है। B और C को उत्पाद के बारे में समान जानकारी की आवश्यकता नहीं हो सकती है, लेकिन ईवेंट में दोनों को समाहित करना होगा (जब तक कि हम ईवेंट को दो में अलग नहीं करते)। यदि दिया गया डेटा दिए गए ईवेंट के भीतर मौजूद नहीं है, तो कोड उसका उपयोग नहीं कर सकता है - यदि हम दिए गए उत्पाद में एक रंग विकल्प जोड़ेंगे , तो B और C में मौजूदा आदेशों के लिए, दिया गया उत्पाद तब तक बेरंग हो जाएगा जब तक कि हम घटनाओं को अपडेट नहीं करते हैं और फिर उन्हें फिर से चलाएँ। ।
समाधान २
घटना के भीतर उत्पाद का केवल गाइड भेजें - इसका मतलब निम्नलिखित संरचना है order_placed
:
{
order_id: [guid],
product_id: [guid]
}
सेवाओं पर बी और सी उत्पाद जानकारी तालिका में product_id
विशेषता में संग्रहीत की जाती हैorders
उत्पाद जानकारी को बी एंड सी द्वारा तब प्राप्त किया जाता है जब A/product/[guid]
एंडपॉइंट के लिए एपीआई कॉल की आवश्यकता होती है
समस्याएं : यह B और C को A (हर समय) पर निर्भर करता है। यदि उत्पाद का स्कीमा A पर बदलता है, तो उन सभी सेवाओं पर परिवर्तन किए जाने चाहिए जो उन पर निर्भर हैं (अचानक)
समाधान 3
घटना के भीतर उत्पाद का केवल गाइड भेजें - इसका अर्थ है ऑर्डर के लिए निम्नलिखित संरचना:
{
order_id: [guid],
product_id: [guid]
}
सेवाओं पर बी और सी उत्पाद की जानकारी products
तालिका में संग्रहीत है ; अभी भी मेज product_id
पर orders
है, लेकिन products
ए, बी और सी के बीच डेटा की प्रतिकृति है; B और C में A के मुकाबले उत्पाद के बारे में अलग-अलग जानकारी हो सकती है
जब बी और सी सेवाओं का निर्माण किया जाता है और A/product
एंडपॉइंट (जो सभी उत्पादों की आवश्यक जानकारी प्रदर्शित करता है) या डायरेक्ट डी तक पहुंच प्राप्त करके और आवश्यक उत्पाद जानकारी की प्रतिलिपि बनाकर उत्पाद जानकारी के बारे में जानकारी बदल दी जाती है और जब भी आवश्यक हो, उसके लिए आवश्यक उत्पाद जानकारी की प्रतिलिपि बनाकर अद्यतन किया जाता है। सर्विस।
समस्याएं : यह B और C को A (जब बीजारोपण) पर निर्भर करता है। यदि उत्पाद का स्कीमा A पर बदलता है, तो उन सभी सेवाओं पर परिवर्तन किए जाने चाहिए जो उन पर निर्भर करती हैं (जब सीडिंग)
मेरी समझ से, सही दृष्टिकोण समाधान 1 के साथ जाना होगा, और या तो निश्चित तर्क के अनुसार घटनाओं के इतिहास को अपडेट करें (यदि उत्पाद सूची नहीं बदली गई है और हम प्रदर्शित होने के लिए रंग जोड़ना चाहते हैं, तो हम वर्तमान स्थिति प्राप्त करने के लिए सुरक्षित रूप से इतिहास को अपडेट कर सकते हैं। उत्पादों की और घटनाओं के भीतर लापता डेटा भरें) या दिए गए डेटा के किसी भी अस्तित्व के लिए पूरा करें (यदि उत्पाद कैटलॉग बदल गया है और हम प्रदर्शित होने के लिए रंग जोड़ना चाहते हैं, तो हम निश्चित नहीं हो सकते हैं यदि उस समय में दिए गए उत्पाद में एक रंग था या नहीं - हम मान सकते हैं कि पिछली सूची के सभी उत्पाद काले थे और घटनाओं या कोड को अपडेट करके पूरा किया गया था)
updating event history
मेरा मतलब नहीं है: सभी घटनाओं के माध्यम से जाना, उन्हें एक धारा (v1) से दूसरे स्ट्रीम (v2) में कॉपी करके लगातार घटना स्कीमा बनाए रखना है।
display image at the point when purchase was made
) या नहीं (के इरादे का प्रतिनिधित्व कर सकते हैं display current image as it within catalog
)
updating event history
- इवेंट सोर्सिंग इवेंट में इतिहास आपके सत्य का स्रोत है और इसे कभी भी बदलना नहीं चाहिए लेकिन केवल आगे बढ़ें। यदि ईवेंट बदलते हैं, तो आप ईवेंट संस्करण या इसी तरह के समाधान का उपयोग कर सकते हैं, लेकिन जब एक विशेष बिंदु तक अपनी घटनाओं को दोहराते हैं, तो उस समय डेटा की स्थिति वैसी ही होनी चाहिए जैसी उस समय थी।