6

अमेज़ॅन किनेसिस स्ट्रीम documentation के अनुसार, एक रिकॉर्ड कई बार वितरित किया जा सकता है।आप अमेज़ॅन किनेसिस रिकॉर्ड डुप्लिकेट कैसे संभालते हैं?

केवल एक बार प्रत्येक रिकॉर्ड को संसाधित करने का एकमात्र तरीका यह है कि उन्हें अस्थायी जांच (जैसे डायनेमोडीबी, लोचदार या MySQL/PostgreSQL) का समर्थन करने वाले डेटाबेस में अस्थायी रूप से संग्रहीत करना है या प्रत्येक किनेसिस शार्ड के लिए केवल रिकॉर्ड आईडी को चेकपॉइंट करना है।

क्या आप डुप्लिकेट को संभालने का एक बेहतर/अधिक प्रभावी तरीका जानते हैं?

उत्तर

6

हम जब कोई मोबाइल एप्लिकेशन के लिए एक टेलीमेटरी प्रणाली के निर्माण वास्तव में समस्या थी । हमारे मामले में हम यह भी अनिश्चित थे कि उत्पादक जहां प्रत्येक संदेश को एक बार भेजते हैं, इसलिए प्रत्येक प्राप्त रिकॉर्ड के लिए हमने फ्लाई पर अपने एमडी 5 की गणना की और जांच की कि क्या यह लगातार भंडारण के किसी रूप में प्रस्तुत किया गया है, लेकिन वास्तव में उपयोग करने के लिए कौन सा भंडारण है सबसे मुश्किल बिट।

सबसे पहले, हमने मामूली रिलेशनल डेटाबेस की कोशिश की, लेकिन यह जल्द ही पूरे सिस्टम की एक बड़ी बाधा बन गई क्योंकि यह केवल पढ़ने-भारी नहीं बल्कि लिखने वाला भारी मामला है, क्योंकि डेटा की मात्रा काफी महत्वपूर्ण थी, हालांकि किनेसिस काफी महत्वपूर्ण थीं ।

हमने प्रत्येक अद्वितीय संदेश के लिए MD5 के संग्रहित डायनेमोडीबी तालिका को समाप्त कर दिया। हमारे पास यह मुद्दा था कि संदेशों को मिटाना इतना आसान नहीं था - भले ही हमारी तालिका में विभाजन और सॉर्ट कुंजियां हों, डायनेमो डीबी किसी दिए गए विभाजन कुंजी के साथ सभी रिकॉर्ड्स को छोड़ने की अनुमति नहीं देती है, हमें सभी को पूछताछ करना पड़ता था कुंजी मानों को क्रमबद्ध करें (जो समय और क्षमता बर्बाद करता है)। दुर्भाग्यवश, हमें बस थोड़ी देर में पूरी टेबल को बस छोड़ना पड़ा। एक और तरीका उपोष्णकटिबंधीय समाधान नियमित रूप से डायनेमोडीबी टेबल को घुमाने के लिए है जो संदेश पहचानकर्ता संग्रहीत करता है।

हालांकि, हाल ही में डायनेमोडीबी ने एक बहुत ही आसान सुविधा - Time To Live पेश की, जिसका मतलब है कि अब हम प्रति रिकॉर्ड आधार पर स्वत: समाप्ति सक्षम करके तालिका के आकार को नियंत्रित कर सकते हैं। उस अर्थ में डायनेमोडीबी एलिस्टी कैश के समान ही प्रतीत होता है, हालांकि एलिस्टी कैश (कम से कम मेमकैड क्लस्टर) बहुत कम टिकाऊ है - वहां कोई अनावश्यकता नहीं है, और ऑपरेशन या विफलता में स्केल के मामले में समाप्त नोड्स पर रहने वाले सभी डेटा खो जाते हैं।

+1

हाय दिमित्री। मैं जस्टगिविंग इंफ्रास्ट्रक्चर के समान कुछ का उपयोग करके कई मानक चला रहा था: https://aws.amazon.com/blogs/compute/serverless-cross-account-stream-replication-using-aws-lambda -मैज़ोन-डायनेमोड-एंड-अमेज़ोन-किनेसिस-फायरहोज/आपने अपनी डीडीबी टेबल के लिए शारिड + सीक्वेंस नम्बर का उपयोग करने के बजाय एमडी 5 चेकसम की गणना क्यों की? – Antonio

+2

हाय @ एंटोनियो। हमारे मामले में यह संभव था कि निर्माता एक ही संदेश पोस्ट करे कई बार। यदि यह मामला था, तो किनेसिस उन्हें किसी भी तरह के अलग-अलग संदेशों के रूप में मानेंगे (बस क्योंकि निर्माता से 2 या अधिक पोस्ट थे)। जैसा कि हम जानते थे कि प्रत्येक संदेश अद्वितीय होना चाहिए, हमने बस उन संदेशों को अवहेलना किया जो एमडी 5 के पास हैं पहले ही देखा जा चुका है। इसके अलावा, एमडी 5 की गणना उत्पादकों द्वारा की गई थी, जो कि कोसमर्स के लिए कुछ गणना समय बचा रहा था (केनेसिस के माध्यम से डेटा की अपेक्षाकृत बड़ी मात्रा में दिया गया था) –

+0

बस वहां फेंकना चाहता था - एडब्ल्यूएस नोट्स अलग उत्पादक त्रुटि मामलों के कारण स्वाभाविक रूप से एक ही रिकॉर्ड को कई बार उत्पादित कर सकते हैं, और अधिक सामान्यतः, कई उपभोक्ता रिकॉर्ड के समान सेट को खींच सकते हैं। मैं अब भी हमारे सिस्टम पर इस से निपट रहा हूं। हम elasticsearch का उपयोग करते हैं, और इस पल के लिए योजना यह सुनिश्चित करने के लिए संस्करण में निर्मित elastics का उपयोग करना है कि एक ही रिकॉर्ड एक ही समय में अपडेट नहीं किया गया है, और उसके बाद रिकॉर्ड पर रिकॉर्ड पर लागू हालिया घटनाओं की एक सूची याद रखें। – genexp

7

आपके द्वारा उल्लिखित बात यह है कि "कम से कम एक बार" दृष्टिकोण के साथ सभी कतार प्रणालियों की एक सामान्य समस्या है। साथ ही, कतार प्रणाली नहीं, उत्पादक और उपभोक्ता दोनों एक ही संदेश को कई बार संसाधित कर सकते हैं (रीडटाइम त्रुटियों आदि के कारण)। किनेसिस और काफ्का दोनों उस प्रतिमान का उपयोग करते हैं। दुर्भाग्य से इसके लिए कोई आसान जवाब नहीं है।

आप कठोर लेनदेन दृष्टिकोण के साथ "बिल्कुल-एक बार" संदेश कतार का उपयोग करने का भी प्रयास कर सकते हैं। उदाहरण के लिए एडब्ल्यूएस एसक्यूएस यह करता है: https://aws.amazon.com/about-aws/whats-new/2016/11/amazon-sqs-introduces-fifo-queues-with-exactly-once-processing-and-lower-prices-for-standard-queues/। सावधान रहें, एसक्यूएस थ्रूपुट किनेसिस से बहुत छोटा है।

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

निम्नलिखित अवधारणाओं को भी देखें;

  1. कम से कम एक बार डिलिवरी: http://www.cloudcomputingpatterns.org/at_least_once_delivery/
  2. वास्तव में एक बार डिलिवरी: http://www.cloudcomputingpatterns.org/exactly_once_delivery/
  3. idempotent प्रोसेसर: http://www.cloudcomputingpatterns.org/idempotent_processor/
+0

आपके उत्तर के लिए धन्यवाद। मैं उच्च थ्रूपुट के कारण एसक्यूएस का उपयोग नहीं कर सकता। उच्च थ्रूपुट भी कारण है कि मैं विभिन्न टिकाऊ स्टोरेज (MySQL/PgSQL/Aurora/ElasticSearch/DynamoDB) के साथ कई समाधानों का बेंचमार्क कर रहा हूं। अस्थायी रूप से इवेंट आईडी स्टोर करने का सबसे अच्छा तरीका रेडिस है, लेकिन एलिस्टी कैश आपको डेटा स्थायित्व प्रदान नहीं कर सकता है। यही कारण है कि मैं इसे करने के वैकल्पिक तरीकों की तलाश में था। – Antonio

+1

रेडिस आपको सख्त टीएक्स ट्रैकिंग प्रदान करता है लेकिन यह एकल नोड है और आरडीएस बहुत धीमा है, आप सही हैं। डायनेमो डीबी आपका एकमात्र पासा समाधान प्रतीत होता है। यदि आप ईसी 2 उदाहरणों का प्रबंधन करना चाहते हैं, तो आप हेज़ेलकास्ट या वोल्टडीबी (बहुत सारे आर 3 नोड्स) जैसे मेमोरी क्लस्टर्ड समाधानों को आजमा सकते हैं? – az3

+0

इन-मेमोरी डेटाबेस टिकाऊ नहीं हैं। यदि आपका हेज़ेलकास्ट क्लस्टर विफल रहता है, तो आप यह समझने में सक्षम नहीं हैं कि आपने पहले से कौन से संदेश संसाधित किए हैं। :( – Antonio

संबंधित मुद्दे