यह Kinesis में घटनाओं के प्रसंस्करण और मैं तुम्हें कुछ बिंदुओं "भ्रष्ट" डेटा के साथ इस तरह के मुद्दों को संभालने के लिए अपने लैम्ब्डा समारोह के निर्माण के लिए देने की कोशिश करता हूँ पर एक आम सवाल है। चूंकि यह आपके सिस्टम के अलग-अलग हिस्सों को किनेसिस स्ट्रीम और केनेसिस स्ट्रीम से पढ़ने वाले अन्य हिस्सों में लिखने का सबसे अच्छा अभ्यास है, इसलिए यह सामान्य है कि आपको ऐसी समस्याएं होंगी।
पहला, आपके पास ऐसी समस्याग्रस्त घटनाएं क्यों हैं?
अपनी घटनाओं को संसाधित करने के लिए किनेसिस का उपयोग करना एक जटिल प्रणाली को तोड़ने का एक अच्छा तरीका है जो फ्रंट एंड प्रोसेसिंग (अंतिम उपयोगकर्ताओं की सेवा), और साथ ही कोड/बैक-एंड प्रोसेसिंग (घटनाओं का विश्लेषण) दोनों कर रहा है, आपके सिस्टम के दो स्वतंत्र में। फ्रंट-एंड लोग अपने व्यापार पर ध्यान केंद्रित कर सकते हैं, जबकि बैक-एंड लोगों को फ्रंट एनाल में कोड परिवर्तनों को धक्का देने की आवश्यकता नहीं है, अगर वे अपने विश्लेषणात्मक उपयोग मामलों की सेवा करने के लिए कार्यक्षमता जोड़ना चाहते हैं। किनेसिस घटनाओं का एक बफर है जो दोनों सिंक्रनाइज़ेशन की आवश्यकता को तोड़ता है और व्यापार तर्क कोड को सरल बनाता है।
इसलिए, हम धारा के लिए लिखा उनके "स्कीमा" में लचीला होना घटनाओं चाहते हैं, और सामने के अंत टीमों घटना स्वरूप बदलने के लिए चाहते हैं,, फ़ील्ड जोड़ने, खेतों को नष्ट प्रोटोकॉल बदलने के लिए या एन्क्रिप्शन कुंजी, वे जितनी बार चाहें उतनी बार ऐसा करने में सक्षम होना चाहिए।
अब यह उन टीमों पर निर्भर है जो स्ट्रीम से पढ़ रहे हैं ताकि वे इस तरह की लचीली घटनाओं को कुशल तरीके से संसाधित कर सकें और हर बार ऐसा परिवर्तन हो रहा है। इसलिए, यह सामान्य होना चाहिए कि आपका लैम्ब्डा फ़ंक्शन उन घटनाओं को देखेगा जो इसे संसाधित नहीं कर सकते हैं, और "जहर-गोली" ऐसा दुर्लभ घटना नहीं है जैसा आप उम्मीद कर सकते हैं।
दूसरा, आप ऐसी समस्याग्रस्त घटनाओं को कैसे संभालेंगे?
आपका लैम्ब्डा फ़ंक्शन बैच प्रक्रियाओं की प्रक्रियाओं के लिए प्राप्त करेगा। कृपया ध्यान दें कि आपको घटनाओं को एक-एक करके नहीं मिलना चाहिए, बल्कि घटनाओं के बड़े बैचों में। यदि आपके बैच बहुत छोटे हैं, तो आप जल्दी ही स्ट्रीम पर बड़े झटके प्राप्त करेंगे।
प्रत्येक बैच के लिए आप घटनाओं पर पुन: प्रयास करेंगे, उन्हें संसाधित करेंगे और फिर बैच के अंतिम अनुक्रम-आईडी डायनेमो डीबी में चेक-पॉइंट देखेंगे। लैम्ब्डा के साथ स्वचालित रूप से (: http://docs.aws.amazon.com/lambda/latest/dg/walkthrough-kinesis-events-adminuser-create-test-function.html यहाँ और अधिक देखें): इनमें से अधिकांश चरणों कर रही है
console.log('Loading function');
exports.handler = function(event, context) {
console.log(JSON.stringify(event, null, 2));
event.Records.forEach(function(record) {
// Kinesis data is base64 encoded so decode here
payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
console.log('Decoded payload:', payload);
});
context.succeed();
};
यह वही है, "खुश पथ" में हो रहा है, तो सभी घटनाओं किसी भी समस्या के बिना संसाधित कर रहे हैं। लेकिन अगर आपको बैच में कोई समस्या आती है और आप "" सफलता अधिसूचना वाले ईवेंट नहीं करते हैं, तो बैच विफल हो जाएगा और आपको बैच में सभी घटनाएं फिर से मिलेंगी।
अब आपको यह तय करने की आवश्यकता है कि प्रसंस्करण में विफलता का कारण क्या है।
अस्थाई समस्या (थ्रॉटलिंग, नेटवर्क समस्या ...) - यह एक दूसरे प्रतीक्षा करें और समय की एक जोड़ी के लिए पुन: प्रयास करने के लिए ठीक है। कई मामलों में समस्या स्वयं को हल कर देगी।
कभी-कभी समस्या (स्मृति से बाहर ...) - लैम्ब्डा फ़ंक्शन की स्मृति आवंटन को बढ़ाने या बैच आकार को कम करने के लिए सबसे अच्छा है। कई मामलों में इस तरह के संशोधन मुद्दे को हल करेंगे।
लगातार विफलता - इसका अर्थ है कि आप या तो समस्याग्रस्त घटना की अनदेखी (एक DLQ में रख - मृत अक्षर-पंक्ति) के लिए है कि या इसे संभाल करने के लिए अपने कोड को संशोधित।
समस्या आपके कोड में विफलता के प्रकार की पहचान करने और इसे अलग-अलग संभालने की समस्या है। आपको इसे पहचानने के लिए अपना लैम्ब्डा कोड लिखने की आवश्यकता है (उदाहरण के लिए अपवाद का प्रकार) और अलग-अलग प्रतिक्रिया दें।
आप कंसोल को ऐसी विफलताओं को लिखने और प्रासंगिक अलार्म बनाने के लिए क्लाउडवॉच के साथ एकीकरण का उपयोग कर सकते हैं। आप क्लाउडवॉच लॉग का उपयोग अपने "मृत-अक्षर-कतार" को लॉग करने के तरीके के रूप में भी कर सकते हैं और देख सकते हैं कि समस्या का स्रोत क्या है।
उचित लगता है लेकिन डायनेमो डीबी बिट के बारे में सिर्फ एक त्वरित सवाल है, मुझे स्थिति को कायम रखने की आवश्यकता क्यों है (मुझे लगता है कि आप अनुक्रम संख्या का मतलब है)? – Stefano
क्योंकि जब आप "Kinesis उपभोक्ता अनुप्रयोग" नोड को रोकते हैं और बाद में शुरू करते हैं; आप अंतिम बिंदु से जारी रखने में सक्षम होना चाहिए। – az3
आह हाँ, यह समझ में आता है। – Stefano