घटना वास्तुकला
इवेंट आर्किटेक्चर (EDA)
1) एक घटना क्या है और ईडीए क्यों है
घटना - एक अपरिवर्तनीय तथ्य जो पहले से ही डोमेन में हुआ है ("प्लेयरवेरिफाइड", "कैप्चर्ड")। EDA इन तथ्यों के प्रकाशन और उनके प्रति प्रतिक्रियाओं के आसपास एकीकरण का निर्माण करता है:- सेवाओं की कमजोर कनेक्टिविटी,
- उपभोक्ताओं को स्वतंत्र रूप से स्
- अनुमानों की पुनर्व्यवस्था/पुनर्व्यवस्था,
- पारदर्शी लेखा परीक्षा।
EDA तुल्यकालिक API को रद्द नहीं करता है - यह अतुल्यकालिक परत में क्रॉस-सेवा निर्भरता लाकर उन्हें पूरक करता है।
2) घटना प्रकार
डोमेन: महत्वपूर्ण व्यावसायिक तथ्य (ऑर्डर्ड प्लेस्ड, बोनसफीड)।
एकीकरण: बाहरी प्रणालियों के लिए "स्नैपशॉट्स "/परिवर्तन (UsereUpdated, WalletTyChanged)।
तकनीकी: जीवन चक्र और टेलीमेट्री (दिल की धड़ कन, पाइपलफेल्ट)।
कमांड (घटनाओं नहीं, बल्कि पास में): "डू एक्स" (CapchearPayed) निर्देश।
सिफारिश: डोमेन इवेंट प्राथमिक हैं; एकीकरण विशिष्ट उपभोक्ताओं के लिए अनुमानों द्वारा बनाया ग
3) घटना अनुबंध और स्कीमा
Схема: एवरो/प्रोटोबुफ/JSON स्कीमा + स्कीमा रजिस्ट्री; संगतता रणनीति: उपभोक्ता विकास के लिए 'बैकवर्ड', महत्वपूर्ण विषयों पर 'पूर्ण'।
CloudEvents (id, source, type, time, datacontenttype) - वर्दी शीर्षिका।
आवश्यक मेटाडेटा: 'ईवेंट _ आईडी' (ULID/UUID), 'heased _ at', 'product', 'schema _ version', 'correlation _ id '/' cousation _ id', 'idempotency _ key'।
वर्शनिंग: ऐड-ओनली फ़ील्ड्स, नाम बदलने/सिमेंटिक ब्रेक का निषेध; नए प्रकार - नए विषय/प्रकार।
उदाहरण (एवरो, टुकड़ा):json
{
"type":"record","name":"PaymentCaptured","namespace":"events.v1",
"fields":[
{"name":"event_id","type":"string"},
{"name":"occurred_at","type":{"type":"long","logicalType":"timestamp-micros"}},
{"name":"payment_id","type":"string"},
{"name":"amount","type":{"type":"bytes","logicalType":"decimal","precision":18,"scale":2}},
{"name":"currency","type":"string"},
{"name":"player_id","type":"string"}
]
}
4) डिलीवरी, ऑर्डर और स्थिरता
डिफ़ॉल्ट के रूप में कम से कम एक बार हैंडलर आइडेम्पोटेंसी की आवश्यकता होती है।
आदेश: एक पार्टी (काफ्का) या कतार (RabbitMQ) के भीतर गारंटी, लेकिन पीछे हटने से टूट सकता है; घटना कुंजी को क्रम के एक डोमेन दाने को प्रतिबिंबित करना चाहिए (उदाहरण के लिए, 'प्लेयर _ आईडी')।
स्थिरता: धन/ऋण के लिए - केवल पत्रिकाओं/सागों/मुआवजे के माध्यम से; LWW से बचें।
पढ़ ने का मॉडल: अनुमान और कैश अंततः हो सकते हैं - "प्रगति में अद्यतन"... दिखाएं और सख्त रास्तों के लिए RNOT रणनीतियों का उपयोग करें।
5) आउटबॉक्स/इनबॉक्स и सीडीसी
आउटबॉक्स: सेवा अपने डेटाबेस और एक लेनदेन में आउटबॉक्स टेबल पर एक तथ्य लिखती है - कार्यकर्ता बस को प्रकाशित करता है।
इनबॉक्स: डिडप्लिकेशन के लिए कंज्यूमर स्टोर्स इवेंट _ आईडीविथ प्रोसेसिंग परिणाम।
सीडीसी (डेटा कैप्चर बदलें): अनुप्रयोग परिवर्तन के बिना एकीकरण का निर्माण करने के लिए डेटाबेस (binlog/WAL) से बस में परिवर्तन का प्रवाह।
idempotency: 'idempotency _ key '/' event _ id' द्वारा प्रसंस्करण, बाहरी दुनिया को तब तक न बदलें जब तक तय न हो।
6) CQRS и इवेंट सोर्सिंग
CQRS: अलग लेखन मॉडल और पढ़ ने के अनुमान; अनुमानों का निर्माण घटनाओं से किया जाता है और पीछे रह सकता है।
इवेंट सोर्सिंग: एग्रीगेट स्टेट = इसकी घटनाओं का रोलअप। पेशेवरों: पूर्ण ऑडिट/रीप्ले; विपक्ष: पलायन/योजनाओं/स्नैपशॉट की जटिलता।
अभ्यास: ईएस - हर जगह नहीं, लेकिन जहां इतिहास और मुआवजा महत्वपूर्ण है; CQRS - लगभग हमेशा EDA में।
7) सागास: ऑर्केस्ट्रेशन और कोरियोग्राफी
ऑर्केस्ट्रेशन: समन्वयक कमांड भेजता है और प्रतिक्रिया घटनाओं का इंतजार करता है; जटिल प्रक्रियाओं (KYC→Deposit→Bonus) के लिए सुविधाजनक।
कोरियोग्राफी: सेवाएं एक-दूसरे की घटनाओं पर प्रतिक्रिया देती हैं; आसान लेकिन कठिन ट्रेस करने के लिए।
हमेशा मुआवजे और चरण समय सीमा को परिभाषित करें।
8) टोपोलॉजी डिजाइन (काफ्का/रैबिटएमक्यू)
काफ्का
प्रति डोमेन घटना विषय: 'भुगतान। कब्जा कर लिया। v1 ',' खिलाड़ी। सत्यापित। v1 '।
विभाजन कुंजी: 'player _ id '/' बटुआ _ id' - जहाँ क्रम महत्वपूर्ण है.
'पुनर्वितरण। फैक्टर = 3 ',' मिनट। Insync। प्रतिकृतियाँ = 2 ', निर्माता' acks = all '।
प्रतिधारण: समय के अनुसार (उदा। 7-90 दिन) और/या संघनन (कुंजी द्वारा अंतिम स्थिति)।
बैकऑफ के साथ रीट्री और डीएलक्यू के लिए विषय।
RabbitMQ
एक्सचेंज: 'विषय '/' डायरेक्ट', रूटिंग कुंजी 'भुगतान। कब्जा कर लिया v1 '।
एक विस्तृत प्रशंसक के लिए - 'विषय' + कई कतारें; आरपीसी/कमांड के लिए - अलग कतारें।
एचए के लिए कोरम कतारें; रिट्रे के लिए TTL + डेड-लेटर एक्सचेंज।
9) अवलोकन और एसएलओ ईडीए
SLI/SLO:- एंड-टू-एंड लेटेंसी (occurred_at → संसाधित): p50/p95/p99।
- लैग/आयु: उपभोक्ता अंतराल (काफ्का उपभोक्ता अंतराल, खरगोश बैकलॉग आयु)।
- थ्रूपुट प्रकाशन/प्रसंस्करण।
- DLQ-दर और दोहराव का अनुपात।
- व्यावसायिक लेनदेन की सफलता (जैसे) "जमा की पुष्टि ≤ 5c")।
- 'trace _ id '/' correlation _ id' (OTel) के माध्यम से घटनाओं का सहसंबंध।
- संरेखण से उदाहरण → मेट्रिक्स।
- बर्न-रेट अलर्ट के साथ डैशबोर्ड "Producer→Broker→Consumer"।
10) रिप्ले, रिप्लेसमेंट और बैकफिल
अनुमानों के पुनर्निर्माण/फिक्स करने के लिए रीप्ले करें: नए प्रक्षेपण/स्थान पर ड्राइव करें, फिर रीडिंग स्विच करें।
प्रतिधारण: कानूनी/व्यावसायिक आवश्यकताएं (जीडीपीआर/पीसीआई); संवेदनशील क्षेत्र - एन्क्रिप्ट और/या टोकनाइज़।
बैकफिल: एक-बंद थीम/कतारें, स्पष्ट आरपीएस सीमा को रोकने से बचने के लिए।
11) सुरक्षा और अनुपालन
टीएलएस इन-ट्रांजिट, आंतरिक ग्राहकों के लिए एमटीएलएस।
प्राधिकरण: प्रति-विषय/प्रति-विनिमय एसीएल; Namespace/vhost के माध्यम से मल्टीटेंसी।
पीआईआई: घटना में क्षेत्रों को कम से कम करें; लिफाफा मेटाडेटा अलग से, यदि आवश्यक हो तो एन्क्रिप्टेड पेलोड।
घटनाओं तक पहुंच, "सर्व-शक्तिशाली" कुंजियों को प्रतिबंधित करें।
अवधारण और हटाने का अधिकार (GDPR) नीतियां: या तो डेटा संदर्भ या समाधि की घटनाओं को संग्रहीत करें और अनुमानों में हटा दें।
12) EDA में परीक्षण
अनुबंध परीक्षण: उपभोक्ता योजनाओं की अपनी अपेक्षाओं को मान्य करते हैं (उपभोक्ता
रीप्ले परीक्षण: एक नए हैंडलर/स्कीमा संस्करण के माध्यम से ऐतिहासिक नमूना चलाएं।
अराजकता के परिदृश्य: ब्रोकर देरी/हानि, नोड ड्रॉप, उपभोक्ता अंतराल SLO के भीतर रहते हैं।
सीआई में धुआं: समय विषयों पर एक छोटी एंड-टू-एंड पाइपलाइन।
13) "CRUD एकीकरण → EDA" का प्रवासन
1. डोमेन तथ्यों की पहचान करें।
2. स्रोत सेवाओं में एम्बेड आउटबॉक्स।
3. न्यूनतम डोमेन घटनाओं को प्रकाशित करें और 1-2 अनुमानों को कनेक्ट करें।
4. धीरे-धीरे बिंदु तुल्यकालिक एकीकरण अक्षम करें, उन्हें सदस्यता के साथ बदल दें।
5. टाइप स्कीमा रजिस्ट्री और एक संगतता नीति।
6. खेतों के साथ केवल ऐड-इवेंट का विस्तार करें; टूटता है - केवल नए प्रकारों के माध्यम से।
14) एंटी-पैटर्न
घटनाएँ = "डीटीओ एपीआई" (बहुत वसा, आंतरिक मॉडल पर निर्भर करता है) - उपभोक्ताओं को तोड़ दें।
स्कीमा रजिस्ट्री और संगतता की कमी - "नाजुक" एकीकरण।
कोड से प्रकाशित करना और डाटाबेस में लिखना परमाणु नहीं है (कोई आउटबॉक्स नहीं) - आप घटनाओं को खो देते हैं।
"बिल्कुल हर जगह एक बार" - बिना लाभ के उच्च मूल्य; बेहतर कम से कम एक बार + पहचान।
एक "सार्वभौमिक" विभाजन कुंजी - एक गर्म विभाजन।
सीधे उत्पादन प्रक्षेपण में रीप्ले करें - ऑनलाइन एसएलओ को तोड़ ता है।
15) कार्यान्वयन चेकलिस्ट (0-45 दिन)
0-10 दिन
डोमेन घटनाओं और उनकी कुंजियों (क्रम के दाने) की पहचान करें।
स्कीमा रजिस्ट्री तैनात करें और संगतता रणनीति को मंजूरी दें।
1-2 सेवाओं में आउटबॉक्स/इनबॉक्स जोड़ें; न्यूनतम CloudEvents-लिफाफा।
11-25 दिन
रेट्री/डीएलक्यू, बैकऑफ, हैंडलर की पहचान दर्ज करें।
डैशबोर्ड: लैग/एज/एंड-टू-एंड; बर्न-रेट अलर्ट।
घटना प्रलेखन (कैटलॉग), मालिकों और स्कीमा समीक्षा प्रक्रियाओं।
26-45 दिन
पहले प्रक्षेपण की रीप्ले/पुनर्व्यवस्था; रनबुक रीप्ले और बैकफिल।
सुरक्षा नीतियां (टीएलएस, एसीएल, पीआईआई), प्रतिधारण, जीडीपीआर प्रक्रियाएं।
दलाल और उपभोक्ताओं के लिए नियमित अराजकता और खेल के दिन।
16) परिपक्वता मैट्रिक्स
100% डोमेन घटनाओं को योजनाओं और पंजीकृत द्वारा वर्णित किया गया है।
आउटबॉक्स/इनबॉक्स सभी Tier-0/1 उत्पादकों/उपभोक्ताओं को कवर करता है।
SLO: लक्ष्य के भीतर p95 एंड-टू-एंड विलंबता और उपभोक्ता अंतराल ≥ 99%।
रीप्ले/बैकफिल डाउनटाइम के बिना संभव हैं; सत्यापित रनबुक हैं 'और।
संस्करण: नए क्षेत्र - बिना तोड़े; पुराने उपभोक्ता नहीं गिर रहे हैं।
सुरक्षा: टीएलएस + एमटीएलएस, एसीएल प्रति विषय, एक्सेस लॉग, पीआईआई/रिटेंशन पॉलिसी।
17) मिनी स्निपेट्स
काफ्का निर्माता (विश्वसनीय प्रकाशन, विचार):properties acks=all enable.idempotence=true max.in.flight.requests.per.connection=1 compression.type=zstd linger.ms=5
उपभोक्ता हैंडलर (पहचान, स्यूडोकोड):
python if inbox.contains(event_id): return # дедуп process(event) # побочные эффекты детерминированы inbox.commit(event_id) # atomically with side-effect commit_offset()
RabbitMQ Retry DLX (विचार) के माध्यम से:
- 'queue: tarks' nak पर DLX 'कार्य। फिर से कोशिश करें 1m '(TTL = 60 के दशक) →' tasks 'पर लौटें; आगे '5 मी/15 मी'।
18) निष्कर्ष
EDA स्पष्ट अनुबंधों और प्रबंधित स्थिरता के साथ एकीकरण को व्यावसायिक तथ्यों के प्रवाह में बदल देता है। नींव बनाएं: स्कीमा + रजिस्ट्री, आउटबॉक्स/इनबॉक्स, ऑर्डर कीज़, आइडेम्पोटेंट हैंडलर, एसएलओ और अवलोकन, सुरक्षित प्रतिधारण और रीप्ले। फिर घटनाएं स्केलिंग, एनालिटिक्स और नई विशेषताओं के लिए आपका "सत्य का स्रोत" बन जाएंगी - बिना नाजुक कनेक्शन और रात के प्रवास के।