भाग 8 में हम स्प्रिंग क्लाउड फ़ंक्शन के पीछे की अवधारणा का परिचय देते हैं और भाग 9 में हमने दिखाया कि जावा 21 और स्प्रिंग बूट 3.2 का उपयोग करके स्प्रिंग क्लाउड फ़ंक्शन के साथ एडब्ल्यूएस लैम्ब्डा कैसे विकसित किया जाए। श्रृंखला के इस लेख में, हम ठंडे और गर्म प्रारंभ समय को मापेंगे जिसमें लैम्ब्डा फ़ंक्शन पर स्नैपस्टार्ट को सक्षम करना शामिल है, लेकिन डायनेमोडीबी इनवोकेशन को प्राइम करना और नेटवर्क से गुजरे बिना पूरे एपीआई गेटवे अनुरोध को प्राइम करना (प्रॉक्सी करना) जैसी विभिन्न प्राइमिंग तकनीकों को लागू करना भी शामिल है। . हम अपने माप के लिए स्प्रिंग बूट 3.2 नमूना एप्लिकेशन का उपयोग करेंगे, और सभी लैम्ब्डा फ़ंक्शन के लिए JAVA_TOOL_OPTIONS का उपयोग करेंगे: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" और उन्हें लैम्ब्डा 1024 एमबी मेमोरी देंगे।
आइए लैम्ब्डा फ़ंक्शन पर एडब्ल्यूएस स्नैपस्टार्ट को सक्षम करने का तरीका समझाने से शुरुआत करें क्योंकि यह (शीर्ष पर प्राइमिंग के साथ) सबसे बड़ा लैम्ब्डा प्रदर्शन (विशेष रूप से कोल्ड स्टार्ट समय) अनुकूलन क्षमता प्रदान करता है। यह केवल कॉन्फ़िगरेशन का मामला है:
SnapStart: ApplyOn: PublishedVersions
लैम्ब्डा फ़ंक्शन गुणों या एसएएम टेम्पलेट के वैश्विक फ़ंक्शन अनुभाग में लागू किया गया। मैं हमारे उपयोग के मामले में SnpaStart के शीर्ष पर विभिन्न प्राइमिंग तकनीकों का उपयोग करने के तरीके के बारे में गहराई से जानना चाहता हूं। मैंने अपने लेख AWS Lambda SnapStart में प्राइमिंग के पीछे के विचारों को समझाया - प्राइमिंग, एंड टू एंड विलंबता और परिनियोजन समय को मापना
1) DynamoDB अनुरोध के प्राइमिंग के लिए कोड यहां पाया जा सकता है।
यह वर्ग अतिरिक्त रूप से CraC प्रोजेक्ट के आयात org.crac.Resource इंटरफ़ेस को लागू करता है।
इस मंगलाचरण के साथ
Core.getGlobalContext().register(this);
GetProductByIdWithDynamoDBRequestPrimingHandler वर्ग स्वयं को CRaC संसाधन के रूप में पंजीकृत करता है।
हम सीआरएसी एपीआई से beforeCheckpoint पद्धति को कार्यान्वित करके डायनेमोडीबी मंगलाचरण को अतिरिक्त रूप से शीर्ष पर रखते हैं।
@Override public void beforeCheckpoint(org.crac.Context extends Resource> context) throws Exception { productDao.getProduct("0"); }
जिसे हम लैम्ब्डा फंटियोम के परिनियोजन चरण के दौरान और फायरक्रैकर माइक्रोवीएम स्नैपशॉट लेने से पहले लागू करेंगे।
2) संपूर्ण एपीआई गेटवे अनुरोध के प्राइमिंग के लिए कोड यहां पाया जा सकता है।
यह वर्ग उपरोक्त उदाहरण के अनुसार आयात org.crac.Resource इंटरफ़ेस को अतिरिक्त रूप से लागू करता है।
हम उस बदसूरत तकनीक का फिर से उपयोग करेंगे, जिसका वर्णन मैंने अपने लेख एडब्ल्यूएस लैम्ब्डा स्नैपस्टार्ट - भाग 6 में जावा 11 और माइक्रोनॉट, क्वार्कस और स्प्रिंग बूट फ्रेमवर्क के लिए अनुरोध आमंत्रण को प्राइमिंग में किया है। मैं उत्पादन में इस तकनीक का उपयोग करने की अनुशंसा नहीं करता, लेकिन यह स्प्रिंग बूट और स्प्रिंग क्लाउड फ़ंक्शन मॉडल और लैम्ब्डा मॉडल के बीच मैपिंग को प्री-लोड करके संपूर्ण एपीआई गेटवे अनुरोध की प्राइमिंग का उपयोग करके कोल्ड स्टार्ट को कम करने की और संभावनाओं को प्रदर्शित करता है, साथ ही डायनेमोडीबी का प्रदर्शन भी करता है। मंगलाचरण भड़काना।
0 एपीआई गेटवे JSON अनुरोध के बराबर आईडी के साथ /products/{id} का एपीआई गेटवे अनुरोध निर्माण इस तरह दिखता है:
private static String getAPIGatewayRequestMultiLine () { return """ { "resource": "/products/{id}", "path": "/products/0", "httpMethod": "GET", "pathParameters": { "id": "0" }, "requestContext": { "identity": { "apiKey": "blabla" } } } """; }
beforeCheckpoint जब स्प्रिंग क्लाउड फ़ंक्शन का उपयोग करके नेटवर्क से गुजरे बिना पूरे एपीआई गेटवे अनुरोध को प्राइम (प्रॉक्सी) करता है FunctionInvoker क्लास जो एपीआई के इनपुट स्ट्रीम को पास करके अपने हैंडलरिक्वेस्ट विधि को लागू करता है गेटवे JSON अनुरोध ऊपर इस तरह बनाया गया है:
@Override public void beforeCheckpoint(org.crac.Context extends Resource> context) throws Exception { new FunctionInvoker().handleRequest( new ByteArrayInputStream(getAPIGatewayRequestMultiLine(). getBytes(StandardCharsets.UTF_8)), new ByteArrayOutputStream(), new MockLambdaContext()); }
नीचे दिए गए प्रयोग के परिणाम 1 घंटे की अवधि के लिए 1024 एमबी मेमोरी सेटिंग के साथ लैम्ब्डा फ़ंक्शन के साथ 100 से अधिक कोल्ड और लगभग 100,000 वार्म स्टार्ट को पुन: प्रस्तुत करने पर आधारित थे। इसके लिए मैंने लोड टेस्ट टूल का उपयोग किया, लेकिन आप सर्वरलेस-आर्टिलरी या पोस्टमैन जैसे किसी भी टूल का उपयोग कर सकते हैं।
मैंने इन सभी प्रयोगों को 4 अलग-अलग परिदृश्यों के साथ चलाया:
1) कोई स्नैपस्टार्ट सक्षम नहीं है
Template.yaml में निम्नलिखित कॉन्फ़िगरेशन का उपयोग करें:
Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest #SnapStart: #ApplyOn: PublishedVersions
और हमें GetProductByIdWithSpringBoot32SCF नाम के साथ लैम्ब्डा फ़ंक्शन को लागू करने की आवश्यकता है, जिसे GetProductByIdHandler लैम्ब्डा हैंडलर जावा क्लास में मैप किया गया है।
2) स्नैपस्टार्ट सक्षम है लेकिन कोई प्राइमिंग लागू नहीं है
Template.yaml में निम्नलिखित कॉन्फ़िगरेशन का उपयोग करें:
Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest SnapStart: ApplyOn: PublishedVersions
और हमें GetProductByIdWithSpringBoot32SCF नाम के साथ उसी लैम्ब्डा फ़ंक्शन को शुरू करने की आवश्यकता है, जिसे GetProductByIdHandler लैम्ब्डा हैंडलर जावा क्लास में मैप किया गया है।
3) स्नैपस्टार्ट DynamoDB इनवोकेशन प्राइमिंग के साथ सक्षम है
Template.yaml में निम्नलिखित कॉन्फ़िगरेशन का उपयोग करें:
Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest SnapStart: ApplyOn: PublishedVersions
और हमें GetProductByIdWithSpringBoot32SCFAndDynamoDBRequestPriming नाम के साथ लैम्ब्डा फ़ंक्शन को शुरू करने की आवश्यकता है, जिसे GetProductByIdWithDynamoDBRequestPrimingHandler Lambda Handler Java क्लास में मैप किया गया है।
4) स्नैपस्टार्ट एपीआई गेटवे रिक्वेस्ट इनवोकेशन प्राइमिंग/प्रॉक्सीइंग के साथ सक्षम है
Template.yaml में निम्नलिखित कॉन्फ़िगरेशन का उपयोग करें:
Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest SnapStart: ApplyOn: PublishedVersions
और हमें नाम के साथ लैम्ब्डा फ़ंक्शन को लागू करने की आवश्यकता है
GetProductByIdWithSpringBoot32SCFAndWebRequestPriming जिसे GetProductByIdWithWebRequestPrimingHandler Lambda Handler Java क्लास में मैप किया गया है।
संक्षिप्त नाम c ठंडी शुरुआत के लिए है और w गर्म शुरुआत के लिए है।
ठंडा (सी) और गर्म (डब्ल्यू) एमएस में प्रारंभ समय:
परिदृश्य संख्या | सी पी50 | सी पी75 | सी पी90 | सी पी99 | c p99.9 | सी अधिकतम | w p50 | w p75 | w p90 | w p99 | w p99.9 | अधिकतम |
---|---|---|---|---|---|---|---|---|---|---|---|---|
कोई स्नैपस्टार्ट सक्षम नहीं है | 4768.34 | 4850.11 | 4967.86 | 5248.61 | 5811.92 | 5813.31 | 7.16 | 8.13 | 9.53 | 21.75 | 62.00 | 1367.52 |
स्नैपस्टार्ट सक्षम है लेकिन कोई प्राइमिंग लागू नहीं है | 2006.60 | 2065.61 | 2180.17 | 2604.69 | 2662.60 | 2663.54 | 7.45 | 8.40 | 9.92 | 23.09 | 1354.50 | 1496.46 |
DynamoDB इनवोकेशन प्राइमिंग के साथ स्नैपस्टार्ट सक्षम | 1181.40 | 1263.23 | 1384.90 | 1533.54 | 1661.20 | 1662.17 | 7.57 | 8.73 | 10.83 | 23.83 | 492.37 | 646.18 |
स्नैपस्टार्ट एपीआई गेटवे अनुरोध मंगलाचरण प्राइमिंग के साथ सक्षम है | 855.45 | 953.91 | 1107.10 | 1339.97 | 1354.78 | 1355.21 | 8.00 | 9.53 | 12.09 | 26.31 | 163.26 | 547.28 |
अकेले लैम्ब्डा फ़ंक्शन पर स्नैपस्टार्ट को सक्षम करने से, यह लैम्ब्डा फ़ंक्शन के कोल्ड स्टार्ट समय को काफी कम कर देता है। अतिरिक्त रूप से DynamoDB इनवोकेशन प्राइमिंग का उपयोग करके हम मेरे लेख AWS स्नैपस्टार्ट में वर्णित कोल्ड स्टार्ट की तुलना में थोड़ी अधिक कोल्ड स्टार्ट प्राप्त करने में सक्षम हैं - विभिन्न मेमोरी सेटिंग्स का उपयोग करके जावा 21 के साथ कोल्ड और वॉर्म स्टार्ट को मापना जहां हमने शुद्ध लैम्ब्डा के लिए कोल्ड और वॉर्म स्टार्ट को मापा। हमारे परिदृश्य की तरह 1024एमबी मेमोरी सेटिंग सहित किसी भी फ्रेमवर्क के उपयोग के बिना कार्य करें।
लेख में हमने AWS सर्वर रहित जावा कंटेनर के साथ ठंडी और गर्म शुरुआत को मापा और AWS सर्वर रहित जावा कंटेनर के साथ ठंडी और गर्म शुरुआत को मापा और AWS लैम्ब्डा वेब एडाप्टर के साथ ठंड और गर्म शुरुआत को मापा, इसकी तुलना करने पर हमने देखा कि स्प्रिंग क्लाउड फ़ंक्शन अधिक ठंड प्रदान करता है। प्रारंभ समय AWS लैम्ब्डा वेब एडॉप्टर से अधिक है, लेकिन कोल्ड प्रारंभ समय AWS सर्वर रहित जावा कंटेनर से काफी तुलनीय है (परिणाम प्रतिशत के आधार पर थोड़े भिन्न होते हैं)। वार्म स्टार्ट/निष्पादन समय के संदर्भ में, जब विशेष रूप से 99.9 से नीचे के प्रतिशत को देखते हैं, तो सभी 3 दृष्टिकोणों के काफी तुलनीय परिणाम होते हैं।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3