AWS लैंबडा कंटेनर के पुन: उपयोग के लिए सर्वोत्तम अभ्यास

एडब्ल्यूएस लैंबडा को अन्य सेवाओं से जोड़ने पर वार्मिंग शुरू करना

AWS लैम्ब्डा सर्वरहित और स्टेटलेस होने के कारण उच्च स्केलेबिलिटी प्रदान करता है, जिससे लैम्बडा फ़ंक्शन की कई प्रतियों को तुरंत (जैसा कि यहां वर्णित है) उतारा जा सकता है। हालांकि, आवेदन कोड लिखते समय, आप कुछ स्टेटफुल डेटा तक पहुंच चाहते हैं। इसका अर्थ है एक RDS उदाहरण या S3 जैसे डेटास्टोर से कनेक्ट करना। हालाँकि, AWS लेम्बडा से अन्य सेवाओं से जुड़ने से आपके फ़ंक्शन कोड में समय जुड़ जाता है। उच्च स्केलेबिलिटी से साइड इफेक्ट भी हो सकते हैं जैसे कि एक आरडीएस उदाहरण के लिए अनुमत कनेक्शन की अधिकतम संख्या तक पहुंचना। इसका मुकाबला करने का एक विकल्प कनेक्शन को जारी रखने और लंबोदर चल रहे समय को कम करने के लिए AWS लाम्बा में कंटेनर पुन: उपयोग करना है।

मेमने के अनुरोध के जीवनचक्र को समझाने के लिए यहाँ कुछ उपयोगी चित्र हैं।

ठंड शुरू होने के दौरान निम्नलिखित होते हैं, जब आपका कार्य पहली बार या निष्क्रियता की अवधि के बाद किया जाता है:

  • कोड और निर्भरताएं डाउनलोड की जाती हैं।
  • एक नया कंटेनर शुरू किया गया है।
  • रनटाइम बूटस्ट्रैप्ड है।

अंतिम क्रिया आपके कोड को शुरू करना है, जो हर बार लैम्बडा फ़ंक्शन को लागू करने के लिए होता है। यदि कंटेनर को लैम्ब्डा फ़ंक्शन के बाद के आह्वान के लिए पुन: उपयोग किया जाता है, तो हम कोड शुरू करने के लिए आगे छोड़ सकते हैं। इसे एक गर्म शुरुआत कहा जाता है, और यह वह कदम है, जिसे हम अन्य तरीकों से कनेक्ट करते समय अनुकूलित कर सकते हैं, जो हस्तलिखित विधि के दायरे के बाहर कनेक्शन को परिभाषित करता है।

लंबोदर से अन्य AWS सेवाओं से जुड़ना

उदाहरण: RDS उदाहरण से कनेक्ट करें, AWS आइकन यहाँ से स्रोत बनाए गए हैं

हमारे पास चलाने के लिए एक बुनियादी और सामान्य उदाहरण है - हम समृद्ध डेटा प्राप्त करने के लिए एक कंटेनर संसाधन से कनेक्ट करना चाहते हैं। इस उदाहरण में, एक JSON पेलोड एक ID के साथ आता है और लैम्बडा फंक्शन एक RDS उदाहरण से कनेक्ट होता है जो PostgreSQL को आईडी के संबंधित नाम को खोजने के लिए चलाता है ताकि हम समृद्ध पेलोड को वापस कर सकें। क्योंकि लैम्ब्डा फ़ंक्शन RDS से कनेक्ट हो रहा है, जो कि VPC में रहता है, लैम्ब्डा फ़ंक्शन को अब एक निजी सबनेट में भी रहना होगा। यह ठंड शुरू करने के लिए कुछ चरणों को जोड़ता है - एक VPC लोचदार नेटवर्क इंटरफ़ेस (ENI) को संलग्न करने की आवश्यकता है (जैसा कि जेरेमी डेली के ब्लॉग में उल्लेख किया गया है, यह आपकी ठंड शुरू होने का समय जोड़ता है)।

नोट: अगर हम RDS के बजाय DynamoDB के साथ एक कुंजी / मान भंडारण का उपयोग करने के लिए VPC का उपयोग करने से बच सकते थे।

मैं इस कार्य के दो समाधान करूंगा, पहला मेरा ’भोला’ समाधान है, जबकि दूसरा समाधान बाद के चालान के लिए कनेक्शन का पुन: उपयोग करके गर्म शुरुआत के समय के लिए अनुकूलन करता है। फिर हम प्रत्येक समाधान के प्रदर्शन की तुलना करेंगे।

विकल्प 1 - हैंडलर के भीतर आरडीएस से कनेक्ट करें

यह कोड उदाहरण दिखाता है कि मैं इस कार्य को भोलेपन से कैसे कर सकता हूं - डेटाबेस कनेक्शन हैंडलर विधि के भीतर है। पेलोड लौटने से पहले आईडी का नाम लाने के लिए एक सरल चयन क्वेरी है, जिसमें अब नाम भी शामिल है।

आइए देखते हैं कि यह विकल्प 20 की एक संगोष्ठी के साथ 2000 चालानों के फटने के साथ एक छोटे परीक्षण के दौरान कैसे प्रदर्शन करता है। न्यूनतम अवधि 18 एमएस है जिसमें औसत 51ms है और सिर्फ 1 सेकंड अधिकतम (ठंड शुरू होने की अवधि) है।

लम्बे समय की अवधि

नीचे दिए गए ग्राफ़ से पता चलता है कि डेटाबेस में अधिकतम आठ कनेक्शन हैं।

5 मिनट की विंडो में RDS डेटाबेस से कनेक्शन की संख्या।

विकल्प 2 - एक वैश्विक कनेक्शन का उपयोग करें

दूसरा विकल्प हैंडलर विधि के बाहर कनेक्शन को वैश्विक के रूप में परिभाषित करना है। फिर हैंडलर के अंदर, हम यह देखने के लिए एक चेक जोड़ते हैं कि क्या कनेक्शन मौजूद है, और केवल तभी कनेक्ट करें यदि यह नहीं है। इसका मतलब है कि कनेक्शन केवल एक बार प्रति कंटेनर बनाया गया है। इस तरह से सशर्त के साथ कनेक्शन सेट करने का मतलब है कि हमें कोड तर्क द्वारा आवश्यक नहीं होने पर कनेक्शन बनाने की आवश्यकता नहीं है।

हम अब डेटाबेस से कनेक्शन बंद नहीं कर रहे हैं, इसलिए कनेक्शन फ़ंक्शन के बाद के आह्वान के लिए बना हुआ है। कनेक्शन को पुन: उपयोग करने से गर्म शुरुआत अवधि कम हो जाती है - औसत अवधि लगभग 3 गुना तेज है और न्यूनतम 18 एमएस के बजाय 1 एमएस है।

लम्बोदर दुर्योग

RDS उदाहरण से कनेक्ट करना एक समय लेने वाला कार्य है, और प्रत्येक मंगलाचरण के लिए कनेक्ट नहीं करना प्रदर्शन के लिए फायदेमंद है। एक साधारण डेटाबेस क्वेरी के लिए डेटाबेस से कनेक्ट करते समय हम 20 का अधिकतम डेटाबेस कनेक्शन काउंट प्राप्त करते हैं, जो समवर्ती के स्तर से मेल खाता है (हमने 20 समवर्ती चालान x 100 बार बनाया)। जब इनवोकेशन का विस्फोट बंद हो जाता है, तो कनेक्शन धीरे-धीरे बंद हो जाते हैं।

अब जब AWS ने लंबू अवधि भत्ते को बढ़ाकर 15 मिनट कर दिया है, तो इसका मतलब है कि डेटाबेस कनेक्शन अधिक समय तक चल सकता है और आपको RDS अधिकतम कनेक्शन संख्या तक पहुंचने का खतरा हो सकता है। डिफ़ॉल्ट अधिकतम कनेक्शन को RDS पैरामीटर समूह सेटिंग्स में ओवरराइट किया जा सकता है, हालाँकि अधिकतम संख्या में कनेक्शन बढ़ने से मेमोरी आवंटन में समस्या हो सकती है। छोटे उदाहरणों में 100 से कम का डिफ़ॉल्ट max_connections मान हो सकता है। इन सीमाओं से सावधान रहें, और केवल जरूरत पड़ने पर डेटाबेस से जुड़ने के लिए एप्लिकेशन लॉजिक जोड़ें।

अन्य कार्यों के लिए एक वैश्विक कनेक्शन का उपयोग करना

लैम्ब्डा S3 से कनेक्ट हो रहा है

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

s3-get-object लैम्ब्डा ब्लूप्रिंट कोड स्निपेट https://console.aws.amazon.com/lambda/home?region=us-east-1#/create/new?bp=s3-get-object-python

पर्यावरण चर को डिक्रिप्ट करना

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

https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions और https://docs.aws.amazon.com/lambda/latest/dg/tutorial-env_conline.html

अन्य FaaS समाधान में वैश्विक चर का उपयोग करना

यह दृष्टिकोण AWS लैम्ब्डा से पृथक नहीं है। वैश्विक कनेक्शन का उपयोग करने का तरीका अन्य क्लाउड प्रदाताओं के सर्वर रहित कार्यों पर भी लागू किया जा सकता है। Google क्लाउड फ़ंक्शंस युक्तियाँ और ट्रिक्स पृष्ठ गैर-आलसी चर के लिए एक अच्छी व्याख्या देता है (जब चर हमेशा हैंडलर विधि के बाहर आरंभीकृत किया जाता है) बनाम आलसी चर (वैश्विक चर केवल तब सेट होता है जब जरूरत होती है) वैश्विक चर।

अन्य श्रेष्ठ आचरण

यहाँ कुछ अन्य सर्वोत्तम प्रथाओं को ध्यान में रखना है।

परिक्षण

FaaS का उपयोग करने से माइक्रोसर्विस आर्किटेक्चर होने में सुविधा होती है। और कार्यक्षमता के छोटे, असतत टुकड़ों को प्रभावी इकाई परीक्षण के साथ हाथ में जाता है। अपने यूनिट परीक्षणों की सहायता के लिए:

  • लैम्ब्डा पैकेज से परीक्षण निर्भरता को बाहर करने के लिए याद रखें।
  • हैंडलर विधि से अलग तर्क को अलग करें, जैसा कि आप एक कार्यक्रम की मुख्य विधि के साथ करेंगे।

निर्भरता और पैकेज का आकार

परिनियोजन पैकेज का आकार कम करने का अर्थ है कि कोड डाउनलोड करना प्रारंभ में तेज़ हो जाएगा और इसलिए आपके ठंड के प्रारंभ समय में सुधार होगा। अनुपयोगी लाइब्रेरी और डेड कोड को डिप्लॉयमेंट ज़िप फ़ाइल का आकार कम करने के लिए निकालें। AWS SDK को पायथन और जावास्क्रिप्ट रनटाइम के लिए प्रदान किया जाता है ताकि उन्हें आपके परिनियोजन पैकेज में शामिल करने की कोई आवश्यकता न हो।

यदि Node.js आपका पसंदीदा लंबोदर रनटाइम है, तो आप अपने फ़ंक्शन कोड के आकार को कम करने और अपने परिनियोजन पैकेज के आकार को कम करने के लिए minification और uglification लागू कर सकते हैं। कुछ नहीं, लेकिन सभी प्रकार के न्यूनतमकरण और कुरूपता को अन्य रनटाइम्स पर लागू किया जा सकता है, जैसे। आप अजगर कोड से व्हॉट्सएप को हटा नहीं सकते हैं लेकिन आप टिप्पणियों को हटा सकते हैं और चर नामों को छोटा कर सकते हैं।

मेमोरी सेट करना

लैम्ब्डा फंक्शन के लिए अधिकतम मात्रा में मेमोरी खोजने का प्रयोग। आप मेमोरी आवंटन के लिए भुगतान करते हैं, इसलिए मेमोरी को दोगुना करने का मतलब है कि आपको प्रति मिलीसेकेंड दोगुना भुगतान करना होगा; लेकिन गणना क्षमता आवंटित स्मृति के साथ बढ़ती है, इसलिए यह संभावित रूप से चल रहे समय को आधे से भी कम कर सकती है। इस तरह के रूप में आप के लिए इष्टतम स्मृति सेटिंग का चयन करने के लिए पहले से ही कुछ उपयोगी उपकरण हैं।

समाप्त करने के लिए…

एक बात पर विचार करना है कि क्या कनेक्शन पुन: उपयोग विधि को लागू करना आवश्यक है। यदि आपका लैंबडा फ़ंक्शन केवल बार-बार लागू किया जा रहा है, जैसे कि दिन में एक बार, तो आपको गर्म शुरुआत के लिए अनुकूलन करने से कोई लाभ नहीं होगा। आपके कोड के प्रदर्शन बनाम पठनीयता के अनुकूलन के बीच बनाने के लिए अक्सर एक व्यापार-बंद होता है - शब्द "अतिक्रमण" खुद के लिए बोलता है! इसके अलावा, अन्य सेवाओं से कनेक्शन का पुन: उपयोग करने के लिए अपने कोड में वैश्विक चर जोड़ने से संभवतः आपके कोड को ट्रेस करना अधिक कठिन हो सकता है। दो सवाल दिमाग में आते हैं:

  • क्या एक नया टीम सदस्य आपके कोड को समझेगा?
  • क्या आप और आपकी टीम भविष्य में कोड को डीबग कर पाएंगे?

लेकिन संभावना है कि आपने लैम्बडा को इसके पैमाने के लिए चुना है और उच्च प्रदर्शन और कम लागत चाहते हैं, इसलिए अपनी टीम की आवश्यकताओं के अनुरूप संतुलन खोजें।

ये राय लेखक की हैं। जब तक इस पद पर अन्यथा उल्लेख नहीं किया जाता है, कैपिटल वन संबद्ध नहीं है, और न ही यह उल्लेखित कंपनियों में से किसी के द्वारा समर्थित है। उपयोग किए गए या प्रदर्शित सभी ट्रेडमार्क और अन्य बौद्धिक संपदा उनके संबंधित स्वामियों के स्वामित्व हैं। यह लेख © 2019 कैपिटल वन है।