أفضل الممارسات لإعادة استخدام حاوية AWS Lambda

تحسين بدء الدفء عند توصيل AWS Lambda بخدمات أخرى

يوفر AWS Lambda قابلية عالية للتطوير بسبب كونه بلا خادم وبلا جنسية ، مما يسمح بنسخ العديد من نسخ وظيفة lambda على الفور (كما هو موضح هنا). ومع ذلك ، عند كتابة رمز التطبيق ، من المحتمل أنك تريد الوصول إلى بعض البيانات ذات الحالة. هذا يعني الاتصال بمخزن بيانات مثل مثيل RDS أو S3. ومع ذلك ، يضيف الاتصال بخدمات أخرى من AWS Lambda وقتًا إلى رمز الوظيفة الخاص بك. قد يكون هناك أيضًا تأثيرات جانبية من قابلية التوسع العالية مثل الوصول إلى الحد الأقصى لعدد الاتصالات المسموح بها بمثيل RDS. خيار واحد لمواجهة هذا هو استخدام إعادة استخدام الحاوية في AWS Lambda للاستمرار في الاتصال وتقليل وقت تشغيل lambda.

هناك بعض المخططات المفيدة هنا لشرح دورة حياة طلب لامدا.

يحدث ما يلي أثناء بداية باردة ، عندما يتم استدعاء وظيفتك لأول مرة أو بعد فترة من عدم النشاط:

  • يتم تنزيل الرمز والتبعيات.
  • بدأت حاوية جديدة.
  • وقت التشغيل هو bootstrapped.

الإجراء الأخير هو بدء تشغيل الكود ، والذي يحدث في كل مرة يتم فيها استدعاء وظيفة lambda. إذا تم إعادة استخدام الحاوية لاستدعاء لاحقة لوظيفة lambda ، فيمكننا التخطي إلى الأمام لبدء الرمز. يُطلق على ذلك بداية دافئة ، وهذه هي الخطوة التي يمكننا تحسينها عند الاتصال بخدمات أخرى عن طريق تحديد الاتصال خارج نطاق طريقة المعالج.

الاتصال بخدمات AWS الأخرى من Lambda

مثال: اتصل بمثيل RDS ، أيقونات AWS مصدرها هنا

لدينا مثال أساسي ومشترك للتطبيق - نريد الاتصال بمورد حاوية لجلب بيانات التخصيب. في هذا المثال ، تأتي حمولة JSON بمعرف وتتصل وظيفة Lambda بمثيل RDS يشغل PostgreSQL للعثور على اسم المعرف المقابل حتى نتمكن من إرجاع الحمولة المخصبة. نظرًا لأن وظيفة lambda تتصل بـ RDS ، التي تعيش في VPC ، تحتاج وظيفة lambda الآن إلى العيش في شبكة فرعية خاصة أيضًا. يضيف ذلك بضع خطوات إلى البداية الباردة - يلزم إرفاق واجهة شبكة مرنة VPC (ENI) (كما هو مذكور في مدونة Jeremy Daly ، وهذا يضيف وقتًا لبدء التشغيل البارد).

ملاحظة: يمكن أن نتجنب استخدام VPC إذا أردنا استخدام مفتاح تخزين / قيمة مع DynamoDB بدلاً من RDS.

سأذهب إلى حلين لهذه المهمة ، الأول هو حل "السذاجة" ، في حين أن الحل الثاني هو الأمثل لأوقات البدء الدافئة من خلال إعادة الاتصال من أجل الدعوات اللاحقة. ثم سنقارن أداء كل حل.

الخيار 1 - الاتصال RDS داخل المعالج

يوضح مثال التعليمات البرمجية هذا كيف يمكنني الاقتراب من هذه المهمة بسلاسة - اتصال قاعدة البيانات ضمن طريقة المعالج. يوجد استعلام تحديد بسيط لجلب اسم المعرف قبل إرجاع الحمولة ، التي تتضمن الآن الاسم.

دعونا نرى كيف يعمل هذا الخيار أثناء اختبار صغير مع مجموعة من 2000 من الدعوات بتزامن 20. الحد الأدنى للمدة هو 18 مللي ثانية بمعدل 51 مللي ثانية وما يزيد قليلاً عن ثانية واحدة (مدة البدء الباردة).

لامدا المدة

يوضح الرسم البياني أدناه أن هناك عددًا أقصى من ثمانية اتصالات لقاعدة البيانات.

عدد الاتصالات بقاعدة بيانات RDS في نافذة مدتها 5 دقائق.

الخيار 2 - استخدام اتصال عمومي

الخيار الثاني هو تعريف الاتصال كعمومي خارج أسلوب المعالج. ثم داخل المعالج ، نضيف التحقق لمعرفة ما إذا كان الاتصال موجودًا ، والاتصال فقط إذا كان غير موجود. هذا يعني أن الاتصال يتم مرة واحدة فقط لكل حاوية. إعداد الاتصال بهذه الطريقة مع الشرطية في مكانها يعني أننا لسنا بحاجة إلى إجراء اتصال إذا لم يكن مطلوبًا من قبل منطق الرمز.

لم نعد نغلق الاتصال بقاعدة البيانات ، لذلك يبقى الاتصال لاستدعاء الوظيفة لاحقًا. إعادة استخدام الاتصال يقلل بشكل كبير من فترات البداية الدافئة - متوسط ​​المدة حوالي 3 مرات أسرع والحد الأدنى هو 1 مللي ثانية بدلاً من 18 مللي ثانية.

Lambda Durations

يعد الاتصال بمثيل RDS مهمة تستغرق وقتًا طويلًا ، كما أن عدم الاضطرار إلى الاتصال لكل استدعاء أمر مفيد للأداء. عند الاتصال بقاعدة البيانات للحصول على استعلام قاعدة بيانات بسيط ، نحقق الحد الأقصى لعدد اتصال قاعدة البيانات وهو 20 ، والذي يطابق مستوى التزامن (قدمنا ​​20 دعوة متزامنة × 100 مرة). عندما يتوقف انفجار الدعوات ، يتم إغلاق الاتصالات تدريجياً.

الآن وبعد أن زادت AWS من مدة lambda إلى 15 دقيقة ، فهذا يعني أن اتصالات قاعدة البيانات قد تستمر لفترة أطول وقد تكون في خطر الوصول إلى رقم اتصالات RDS max. يمكن الكتابة فوق اتصالات الحد الأقصى الافتراضية في إعدادات مجموعة معلمات RDS ، على الرغم من أن زيادة الحد الأقصى لعدد الاتصالات قد يؤدي إلى مشاكل في تخصيص الذاكرة. يمكن أن يكون للمثيلات الأصغر قيمة افتراضية max_connections أقل من 100. ضع في اعتبارك هذه الحدود ، وأضف فقط منطق التطبيق للاتصال بقاعدة البيانات عند الحاجة.

باستخدام اتصال عمومي للمهام الأخرى

Lambda الاتصال بـ S3

تتمثل المهمة الشائعة التي قد نحتاج إلى تنفيذها مع Lambda في الوصول إلى بيانات حالة من S3. مقتطف الشفرة أدناه عبارة عن مخطط برنامج Python Lambda Function يوفره AWS - والذي يمكنك التنقل إليه من خلال تسجيل الدخول إلى وحدة التحكم في AWS والنقر هنا. يمكنك أن ترى في الكود أنه يتم تعريف عميل S3 بالكامل خارج المعالج عند تهيئة الحاوية ، في حين تم تعيين الاتصال العمومي داخل المعالج ، على سبيل المثال RDS. سيحدد كلا النهجين المتغيرات العالمية مما يتيح لها أن تكون متاحة لدعوات لاحقة.

مقتطف شفرة مخطط lambda s3-get-object https://console.aws.amazon.com/lambda/home؟region=us-east-1#/create/new؟bp=s3-get-object-python

فك تشفير متغيرات البيئة

تمنحك وحدة التحكم lambda خيار تشفير متغيرات البيئة الخاصة بك لمزيد من الأمان. مقتطف الشفرة التالي هو عبارة عن AWS يوفر جافا مثالًا لبرنامج نصي مساعد لفك تشفير متغيرات البيئة من دالة Lambda. يمكنك الانتقال إلى مقتطف الشفرة باتباع هذا البرنامج التعليمي (على وجه التحديد الخطوة 6). لأنه يتم تعريف DECRYPTED_KEY كفئة عمومية ، يتم استدعاء الدالة decryptKey () والمنطق مرة واحدة فقط في حاوية lambda. لذلك ، سوف نرى تحسنا كبيرا في فترات البداية الدافئة.

https://console.aws.amazon.com/lambda/home؟region=us-east-1#/functions و https://docs.aws.amazon.com/lambda/latest/dg/tutorial-env_console.html

استخدام المتغيرات العالمية في حلول FaaS الأخرى

هذا النهج ليس معزولًا عن AWS Lambda. يمكن تطبيق طريقة استخدام اتصال عمومي على وظائف الخوادم الأخرى الخاصة بالخوادم السحابية أيضًا. تقدم صفحة النصائح والخدع في Google Cloud Functions شرحًا جيدًا للمتغيرات غير الكسولة (عندما يتم تهيئة المتغير دائمًا خارج طريقة المعالج) مقابل المتغيرات البطيئة (المتغير الشامل فقط عند الحاجة) المتغيرات العامة.

أفضل الممارسات الأخرى

فيما يلي بعض أفضل الممارسات التي يجب وضعها في الاعتبار.

اختبارات

باستخدام FaaS يسهل وجود بنية microservices. إن امتلاك قطع صغيرة منفصلة من الوظائف يسير جنباً إلى جنب مع اختبار فعال للوحدة. للمساعدة في اختبارات وحدتك:

  • تذكر أن تستبعد تبعيات الاختبار من حزمة lambda.
  • افصل بين المنطق بعيدًا عن طريقة المعالج ، كما تفعل مع الطريقة الرئيسية للبرنامج.

التبعيات وحجم الحزمة

إن تقليل حجم حزمة النشر يعني أن تنزيل الكود سيكون أسرع عند التهيئة وبالتالي سيحسِّن أوقات البداية الباردة. قم بإزالة المكتبات غير المستخدمة والرموز الناقصة لتقليل حجم ملف ZIP للنشر. يتم توفير AWS SDK لنظامي التشغيل Python و JavaScript حتى لا تكون هناك حاجة لإدراجها في حزمة النشر الخاصة بك.

إذا كان Node.js هو وقت تشغيل Lambda المفضل لديك ، فيمكنك تطبيق التصغير والإقصاء لتقليل حجم رمز الوظيفة وتقليل حجم حزمة النشر الخاصة بك. يمكن تطبيق بعض وليس كل جوانب التصغير والقبح على أوقات التشغيل الأخرى ، على سبيل المثال. لا يمكنك إزالة مسافة بيضاء من رمز python ولكن يمكنك إزالة التعليقات وتقصير أسماء المتغيرات.

وضع الذاكرة

تجربة للعثور على مقدار الذاكرة الأمثل لوظيفة Lambda. أنت تدفع مقابل تخصيص الذاكرة ، لذا فإن مضاعفة الذاكرة تعني أنه يجب عليك دفع ضعف لكل ميلي ثانية واحدة ؛ ولكن زيادة سعة حساب الذاكرة المخصصة لذلك يمكن أن تقلل من وقت التشغيل إلى أقل من نصف ما كان عليه. هناك بالفعل بعض الأدوات المفيدة لتحديد إعداد الذاكرة الأمثل لك مثل هذا الإعداد.

ليستنتج…

شيء واحد يجب مراعاته هو ما إذا كان تطبيق طريقة إعادة الاتصال ضروريًا. إذا تم استدعاء وظيفة lambda الخاصة بك بشكل غير منتظم ، مثل مرة واحدة يوميًا ، فلن تستفيد من التحسين لبدء التشغيل. غالبًا ما تكون هناك مفاضلة بين التحسين من أجل الأداء مقابل قابلية قراءة الكود - مصطلح "الإغراء" يتحدث عن نفسه! بالإضافة إلى ذلك ، فإن إضافة متغيرات عالمية إلى الكود الخاص بك لإعادة استخدام الاتصالات مع الخدمات الأخرى يمكن أن يجعل تتبع التعليمات البرمجية أكثر صعوبة. سؤالان يتبادران إلى الذهن:

  • هل سيتفهم عضو الفريق الجديد الرمز الخاص بك؟
  • هل ستتمكن أنت وفريقك من تصحيح الكود في المستقبل؟

لكن من المحتمل أنك اخترت Lambda لمقياسه وتريد أداءً عاليًا وتكاليف منخفضة ، لذا ابحث عن التوازن الذي يناسب احتياجات فريقك.

هذه الآراء هي آراء المؤلف. ما لم تتم الإشارة إلى خلاف ذلك في هذا المنشور ، فإن Capital One لا ينتمي له ، ولا يتم اعتماده من قبل أي من الشركات المذكورة. جميع العلامات التجارية والملكية الفكرية الأخرى المستخدمة أو المعروضة هي ملك لأصحابها. هذه المقالة هي © 2019 Capital One.