1. सवाल
एक ऑर्डर-इवेंट स्ट्रीम को पार्स, विंडो, एग्रीगेट और जोखिम (risk) के लिए स्कोर किया जाता है। परिणाम एक डेटा वेयरहाउस में लिखे जाते हैं और एक डाउनस्ट्रीम नोटिफिकेशन ट्रिगर किया जाता है। वर्कर्स क्रैश हो सकते हैं, नेटवर्क टाइम आउट हो सकते हैं, और इवेंट्स देर से आ सकते हैं। Exactly-once की सीमा समझाएं और एक ऐसा फ्लो डिज़ाइन करें जो पुनः प्रयासों (retries) के दौरान डुप्लिकेट चार्ज न बनाए।
2. बाधाएं और स्पष्टीकरण
- तीन स्तरों को अलग करें: मैसेज डिलीवरी, इन-पाइपलाइन परिणाम, और बाहरी साइड इफेक्ट्स।
- इवेंट्स डुप्लिकेट, क्रम से बाहर (out of order), या देर से हो सकते हैं; प्रोसेसिंग लॉग किसी कमिट किए गए परिणाम का प्रमाण नहीं है।
- परिणाम रीप्ले करने योग्य होने चाहिए, जबकि नोटिफिकेशन्स और अन्य बाहरी कॉल्स को आइडम्पोटेंसी (idempotency) या डीडुप्लिकेशन की आवश्यकता होती है।
- कोई कार्यान्वयन (implementation) चुनने से पहले लेटेंसी, लेट-अराइवल विंडो, और ड्रॉपिंग पॉलिसी को स्पष्ट करें।
3. मुख्य अवधारणा
Exactly-once प्रोसेसिंग का आमतौर पर मतलब यह होता है कि किसी रिकॉर्ड का पाइपलाइन परिणाम ड्यूरेबल आउटपुट में अधिकतम एक बार दिखाई दे, जबकि सिस्टम रिकॉर्ड को खोने से भी बचता है। इसका मतलब यह नहीं है कि हर यूज़र फ़ंक्शन केवल एक बार चलता है, और यह स्वचालित रूप से किसी HTTP, ईमेल या डेटाबेस कॉल को कवर नहीं करता है। At-least-once इनपुट के साथ चेकपॉइंट्स, डिटर्मिनिस्टिक रीप्ले और रिज़ल्ट डीडुप्लिकेशन एक सत्यापन योग्य (verifiable) आउटपुट गारंटी उत्पन्न कर सकते हैं।
4. संदर्भ फ्लो
onEvent(event):
key = stableEventId(event)
state = readCheckpointOrState(key)
result = deterministicTransform(event, state)
writeTransactionalResult(key, result) # unique(key)
commitCheckpointAfterResult(key)
onExternalSideEffect(result):
idempotencyKey = result.eventId + ":" + result.version
callOrOutbox(idempotencyKey, result.payload)पहले एक विशिष्टता प्रतिबंध (uniqueness constraint) या ट्रांज़ैक्शन के साथ परिणाम और इवेंट ID को स्टोरेज में लिखें, फिर चेकपॉइंट को आगे बढ़ाएं। बाहरी नोटिफिकेशन्स को एक आइडम्पोटेंट API या आउटबॉक्स और एक अलग सेंडर के माध्यम से रूट करें। सेंडर पुनः प्रयास (retry) कर सकता है, जबकि रिसीवर दिए गए आइडम्पोटेंसी कुंजी (key) को केवल एक बार स्वीकार करता है।
5. विफलता के मामले और ट्रेड-ऑफ़
यदि कोई वर्कर बाहरी कॉल के सफल होने के बाद लेकिन उसके चेकपॉइंट कमिट होने से पहले क्रैश हो जाता है, तो रीप्ले बाहरी सर्विस को फिर से कॉल करता है। आइडम्पोटेंसी कुंजी के बिना, केवल रनर उस डुप्लिकेट साइड इफेक्ट को नहीं हटा सकता है। विंडो के परिणाम लेट डेटा और वॉटरमार्क पर भी निर्भर करते हैं, इसलिए सुधार की सीमा (correction boundary) स्पष्ट होनी चाहिए। मजबूत एंड-टू-एंड गारंटियां डीडुप्लिकेशन स्थिति (state), ट्रांज़ैक्शन समन्वय और स्टोरेज लागत जोड़ती हैं; यदि डुप्लिकेट स्वीकार्य हैं, तो at-least-once कम लेटेंसी प्रदान कर सकता है।
6. सत्यापन और अवलोकनीयता (Observability)
- क्रैश, टाइमआउट, डुप्लिकेट मैसेज और आउट-ऑफ़-ऑर्डर इवेंट्स को इंजेक्ट करें; किसी एक बिज़नेस कुंजी के अंतिम परिणाम का निरीक्षण करें।
- इनपुट इवेंट ID, प्रयास गणना (attempt counts), कमिट वर्ज़न, डीडुप्लिकेशन हिट्स और बाहरी कॉल के परिणामों को रिकॉर्ड करें।
- चार गणनाओं का मिलान करें: प्राप्त (received), संसाधित (processed), कमिटेड (committed), और अधिसूचित (notified)। केवल वर्कर लॉग पर्याप्त नहीं हैं।
- डुप्लिकेट दर, देरी (lateness), चेकपॉइंट की आयु, डीडुप्लिकेशन-स्टेट का आकार और रीप्ले बैकलॉग की निगरानी करें।
7. सामान्य गलतियां
- Exactly-once डिलीवरी, exactly-once प्रोसेसिंग और exactly-once साइड इफेक्ट्स को एक ही वादे के रूप में मानना।
- यह मान लेना कि फ़्रेमवर्क का एक स्विच मनमाने कस्टम कोड और बाहरी API को वन-टाइम प्रभाव देता है।
- एक स्थिर (stable) इवेंट ID के बजाय टाइमस्टैम्प के साथ डीडुप्लिकेट करना, जिससे पुनः प्रयास या रीप्ले पर अलग-अलग कुंजियाँ उत्पन्न होती हैं।
- देर से आने वाले इवेंट्स, वर्ज़न संघर्ष और डीडुप्लिकेशन-रिकॉर्ड प्रतिधारण (retention) को अनदेखा करना।
8. इंटरव्यू स्कोरिंग बिंदु
गारंटी की सीमा तय करता है
उम्मीदवार डिलीवरी, पाइपलाइन परिणामों और बाहरी साइड इफेक्ट्स को अलग करता है, और पहचानता है कि फ़्रेमवर्क वास्तव में किस स्तर को कवर करता है।
एक रीप्ले करने योग्य फ्लो डिज़ाइन करता है
उम्मीदवार एक स्थिर इवेंट ID, डिटर्मिनिस्टिक ट्रांसफ़ॉर्मेशन, ट्रांज़ैक्शनल रिज़ल्ट कमिट और चेकपॉइंट ऑर्डरिंग का उपयोग करता है, फिर क्रैश रिकवरी की व्याख्या करता है।
बाहरी साइड इफेक्ट्स को संभालता है
उम्मीदवार एक आइडम्पोटेंसी कुंजी, विशिष्टता प्रतिबंध, या आउटबॉक्स का प्रस्ताव करता है और बताता है कि सेंडर और रिसीवर मिलकर डुप्लिकेट को कैसे रोकते हैं।
फॉल्ट इंजेक्शन के साथ सत्यापित करता है
उम्मीदवार दावे को मान्य करने के लिए कमिट किए गए डेटा और बिज़नेस समाधान (reconciliation) का उपयोग करते हुए डुप्लिकेट, रीऑर्डरिंग, देरी, टाइमआउट और वर्कर क्रैश को कवर करता है।