Βέλτιστες πρακτικές για επαναχρησιμοποίηση εμπορευματοκιβωτίων AWS Lambda

Βελτιστοποίηση θερμών εκκινήσεων κατά τη σύνδεση AWS Lambda σε άλλες υπηρεσίες

Το AWS Lambda παρέχει υψηλή δυνατότητα κλιμάκωσης εξαιτίας της έλλειψης διακομιστών και των απάτριδων, επιτρέποντας την άμεση αναπαραγωγή πολλών αντιγράφων της λειτουργίας λάμδα (όπως περιγράφεται εδώ). Ωστόσο, κατά τη σύνταξη κώδικα εφαρμογής, είναι πιθανό να θέλετε να έχετε πρόσβαση σε ορισμένα κρατικά δεδομένα. Αυτό σημαίνει σύνδεση με μια βάση δεδομένων, όπως μια παρουσία RDS ή S3. Ωστόσο, η σύνδεση με άλλες υπηρεσίες από το AWS Lambda προσθέτει χρόνο στον κωδικό λειτουργίας σας. Ενδέχεται επίσης να υπάρχουν παρενέργειες από την υψηλή επεκτασιμότητα, όπως η επίτευξη του μέγιστου αριθμού επιτρεπόμενων συνδέσεων σε μια παρουσία RDS. Μία από τις επιλογές είναι να χρησιμοποιηθεί η επαναχρησιμοποίηση δοχείων στο AWS Lambda για να διατηρηθεί η σύνδεση και να μειωθεί ο χρόνος λειτουργίας λάμδα.

Υπάρχουν κάποια χρήσιμα διαγράμματα εδώ για να εξηγήσετε τον κύκλο ζωής ενός αιτήματος λάμβδα.

Τα ακόλουθα συμβαίνουν κατά την εκκίνηση εν ψυχρώ, όταν η λειτουργία σας ενεργοποιείται για πρώτη φορά ή μετά από μια περίοδο αδράνειας:

  • Ο κώδικας και οι εξαρτήσεις λήφθηκαν.
  • Ξεκινάει ένα νέο δοχείο.
  • Ο χρόνος εκτέλεσης είναι bootstrapped.

Η τελική ενέργεια είναι να ξεκινήσετε τον κώδικα σας, ο οποίος συμβαίνει κάθε φορά που χρησιμοποιείται η λειτουργία lambda. Εάν το δοχείο επαναχρησιμοποιηθεί για μια επακόλουθη επίκληση της λειτουργίας λάμδα, μπορούμε να προχωρήσουμε στην εκκίνηση του κώδικα. Αυτό ονομάζεται ζεστή εκκίνηση και αυτό είναι το βήμα που μπορούμε να βελτιστοποιήσουμε όταν συνδέουμε με άλλες υπηρεσίες καθορίζοντας τη σύνδεση εκτός του πεδίου εφαρμογής της μεθόδου χειριστή.

Σύνδεση με άλλες Υπηρεσίες AWS από τη Lambda

Παράδειγμα: Συνδέστε την παρουσία RDS, τα εικονίδια AWS προέρχονται από εδώ

Έχουμε ένα βασικό και κοινό παράδειγμα για να περάσουμε - θέλουμε να συνδεθούμε με έναν πόρο κοντέινερ για να αντλήσουμε δεδομένα εμπλουτισμού. Σε αυτό το παράδειγμα, ένα ωφέλιμο φορτίο JSON έρχεται με ένα αναγνωριστικό και η Λάμδα Λειτουργία συνδέεται με μια εμφάνιση RDS που τρέχει PostgreSQL για να βρει το αντίστοιχο όνομα του αναγνωριστικού ώστε να μπορέσουμε να επιστρέψουμε το εμπλουτισμένο ωφέλιμο φορτίο. Επειδή η λειτουργία lambda συνδέεται με το RDS, το οποίο ζει σε VPC, η λειτουργία lambda πρέπει τώρα να ζήσει και σε ένα ιδιωτικό υποδίκτυο. Αυτό προσθέτει μερικά βήματα στην ψυχρή εκκίνηση - πρέπει να προσαρτηθεί μια διεπαφή ελαστικού δικτύου (ΕΝΙ) VPC (όπως αναφέρθηκε στο ιστολόγιο του Jeremy Daly, αυτό προσθέτει χρόνο στις ψυχρές εκκινήσεις σας).

Σημείωση: θα μπορούσαμε να αποφύγουμε τη χρήση ενός VPC εάν χρησιμοποιούσαμε ένα αποθηκευτικό χώρο κλειδιού / τιμής με το DynamoDB αντί για το RDS.

Θα περάσω πάνω από δύο λύσεις σε αυτό το καθήκον, η πρώτη είναι η «αφελής» λύση μου, ενώ η δεύτερη λύση βελτιστοποιείται για τους χρόνους θερμής εκκίνησης επαναχρησιμοποιώντας τη σύνδεση για επακόλουθες επικλήσεις. Στη συνέχεια θα συγκρίνουμε την απόδοση κάθε λύσης.

Επιλογή 1 - Σύνδεση με το RDS στο χειριστή

Αυτό το παράδειγμα κώδικα δείχνει πώς θα μπορούσα να προσεγγίσω naivly αυτή την εργασία - η σύνδεση βάσης δεδομένων είναι μέσα στη μέθοδο χειριστή. Υπάρχει ένα απλό ερώτημα επιλογής για την εξαγωγή του ονόματος του αναγνωριστικού πριν από την επιστροφή του ωφέλιμου φορτίου, το οποίο περιλαμβάνει τώρα το όνομα.

Ας δούμε πώς εκτελείται αυτή η επιλογή κατά τη διάρκεια μιας μικρής δοκιμής με μια έκρηξη 2000 επικλήσεων με συντομία 20. Η ελάχιστη διάρκεια είναι 18 ms με μέσο όρο 51ms και μόλις πάνω από 1 δευτερόλεπτο το μέγιστο (η διάρκεια κρύου ξεκινήματος).

Λάμδα Διάρκεια

Το παρακάτω γράφημα δείχνει ότι υπάρχει μέγιστος αριθμός οκτώ συνδέσεων στη βάση δεδομένων.

Αριθμός συνδέσεων με βάση δεδομένων RDS σε παράθυρο 5 λεπτών.

Επιλογή 2 - Χρησιμοποιήστε μια παγκόσμια σύνδεση

Η δεύτερη επιλογή είναι να ορίσετε τη σύνδεση ως παγκόσμια εκτός της μεθόδου χειριστή. Στη συνέχεια, μέσα στον χειριστή, προσθέτουμε έναν έλεγχο για να διαπιστώσουμε εάν υπάρχει η σύνδεση και να συνδεθεί μόνο αν δεν υπάρχει. Αυτό σημαίνει ότι η σύνδεση γίνεται μόνο μία φορά ανά περιέκτη. Η ρύθμιση της σύνδεσης με αυτόν τον τρόπο με την προϋπόθεση ότι υπάρχει δεν σημαίνει ότι δεν χρειάζεται να δημιουργήσουμε σύνδεση εάν δεν απαιτείται από τη λογική του κώδικα.

Δεν κλείνουμε πλέον τη σύνδεση με τη βάση δεδομένων, οπότε η σύνδεση παραμένει για επακόλουθη επίκληση της λειτουργίας. Η επαναχρησιμοποίηση της σύνδεσης μειώνει σημαντικά τις διάρκειες θερμής εκκίνησης - η μέση διάρκεια είναι περίπου 3 φορές πιο γρήγορη και το ελάχιστο είναι 1 ms αντί για 18 ms.

Διάρκεια Λάμδα

Η σύνδεση σε μια παρουσία RDS είναι μια χρονοβόρα εργασία και η μη σύνδεση με κάθε κλήση είναι επωφελής για την απόδοση. Κατά τη σύνδεση με τη βάση δεδομένων για ένα απλό ερώτημα βάσης δεδομένων επιτυγχάνεται ένας μέγιστος αριθμός συνδέσεων βάσης δεδομένων 20, ο οποίος ταιριάζει με το επίπεδο συνάφειας (κάναμε 20 ταυτόχρονες επικλήσεις x 100 φορές). Όταν σταματήσει η έκρηξη των επικλήσεων, οι συνδέσεις σταδιακά κλείνουν.

Τώρα που η AWS έχει αυξήσει το επίδομα διάρκειας λάμδα στα 15 λεπτά, αυτό σημαίνει ότι οι συνδέσεις βάσης δεδομένων θα μπορούσαν να διαρκέσουν περισσότερο και θα μπορούσατε να κινδυνεύετε να φτάσετε στον αριθμό RDS max connections. Οι προεπιλεγμένες μέγιστες συνδέσεις μπορούν να αντικατασταθούν στις ρυθμίσεις ομάδας παραμέτρων RDS, αν και η αύξηση του μέγιστου αριθμού συνδέσεων μπορεί να οδηγήσει σε προβλήματα με την κατανομή μνήμης. Οι μικρότερες εμφανίσεις μπορούν να έχουν μια προεπιλεγμένη τιμή max_connections μικρότερη από 100. Λάβετε υπόψη αυτά τα όρια και προσθέτετε μόνο λογική εφαρμογής για να συνδεθείτε στη βάση δεδομένων όταν χρειάζεται.

Χρησιμοποιώντας μια παγκόσμια σύνδεση για άλλες εργασίες

Σύνδεση Lambda στο S3

Ένα κοινό καθήκον που μπορεί να χρειαστεί να εκτελέσουμε με το Lambda είναι να αποκτήσετε πρόσβαση στα δεδομένα από το S3. Το απόσπασμα κώδικα παρακάτω είναι ένα προσχέδιο AWS που παρέχει το πρότυπο λειτουργίας Python Lambda - το οποίο μπορείτε να πλοηγηθείτε, συνδέοντας την κονσόλα AWS και πατώντας εδώ. Μπορείτε να δείτε στον κώδικα ότι ο πελάτης S3 έχει οριστεί πλήρως εκτός του χειριστή όταν το δοχείο είναι αρχικοποιημένο, ενώ για το παράδειγμα RDS η συνολική σύνδεση έχει τεθεί μέσα στο χειριστή. Και οι δύο προσεγγίσεις θα ορίσουν τις συνολικές μεταβλητές επιτρέποντάς τους να είναι διαθέσιμες για επακόλουθες επικλήσεις.

s3-get-object snippet κώδικα λάμδα κώδικα https://console.aws.amazon.com/lambda/home?region=us-east-1#/create/new?bp=s3-get-object-python

Αποκρυπτογράφηση μεταβλητών περιβάλλοντος

Η κονσόλα λάμδα σας δίνει τη δυνατότητα κρυπτογράφησης των μεταβλητών περιβάλλοντος σας για πρόσθετη ασφάλεια. Το ακόλουθο απόσπασμα κώδικα είναι ένα AWS που παρείχε Java παράδειγμα βοηθητικού σεναρίου για την αποκρυπτογράφηση μεταβλητών περιβάλλοντος από μια λειτουργία Lambda. Μπορείτε να πλοηγηθείτε στο απόσπασμα κώδικα ακολουθώντας αυτό το σεμινάριο (συγκεκριμένα βήμα 6). Επειδή το DECRYPTED_KEY ορίζεται ως παγκόσμια κλάση, η λειτουργία και λογική decryptKey () καλείται μόνο μία φορά ανά δοχείο λάμδα. Επομένως, θα δούμε μια σημαντική βελτίωση στις διάρκειες θερμής εκκίνησης.

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 διευκολύνει την κατοχύρωση μιας αρχιτεκτονικής μικροεπιχειρήσεων. Και έχοντας μικρά, ξεχωριστά κομμάτια λειτουργικότητας συμβαδίζει με αποτελεσματικές δοκιμές μονάδων. Για να βοηθήσετε τις δοκιμές της μονάδας σας:

  • Θυμηθείτε να αποκλείσετε τις εξαρτήσεις δοκιμών από το πακέτο λάμδα.
  • Ξεχωρίστε τη λογική μακριά από τη μέθοδο χειριστή, όπως θα κάνατε με μια κύρια μέθοδο ενός προγράμματος.

Εξαρτήσεις και μέγεθος συσκευασίας

Η μείωση του μεγέθους του πακέτου ανάπτυξης σημαίνει ότι η λήψη του κώδικα θα είναι ταχύτερη κατά την εκκίνηση και επομένως θα βελτιώσει τους χρόνους εκκίνησης του κρύου σας. Καταργήστε τις βιβλιοθήκες που δεν χρησιμοποιούνται και το νεκρό κώδικα για να μειώσετε το μέγεθος αρχείου ZIP ανάπτυξης. Το AWS SDK παρέχεται για τις ώρες εκτέλεσης Python και JavaScript, επομένως δεν χρειάζεται να τα συμπεριλάβετε στο πακέτο ανάπτυξης.

Αν το Node.js είναι ο προτιμώμενος χρόνος εκτέλεσης Lambda, θα μπορούσατε να εφαρμόσετε ελαχιστοποίηση και δυσκολία για να μειώσετε το μέγεθος του λειτουργικού σας κώδικα και να ελαχιστοποιήσετε το μέγεθος του πακέτου εγκατάστασής σας. Ορισμένες αλλά όχι όλες οι πτυχές της εξομάλυνσης και της ακρίβειας μπορούν να εφαρμοστούν σε άλλες χρονικές περιόδους λειτουργίας, π.χ. δεν μπορείτε να καταργήσετε το κενό διάστημα από τον κώδικα python, αλλά μπορείτε να καταργήσετε σχόλια και να συντομεύσετε τα ονόματα μεταβλητών.

Ρύθμιση της μνήμης

Πειραματιστείτε για να βρείτε τη βέλτιστη ποσότητα μνήμης για τη λειτουργία Lambda. Πληρώνετε για την κατανομή της μνήμης, οπότε ο διπλασιασμός της μνήμης σημαίνει ότι πρέπει να πληρώσετε διπλά ανά χιλιοστό του δευτερολέπτου. αλλά υπολογίζει την αύξηση της χωρητικότητας με την κατανεμημένη μνήμη, ώστε να μπορεί να μειώσει τον χρόνο εκτέλεσης σε λιγότερο από το μισό από αυτό που ήταν. Υπάρχουν ήδη μερικά χρήσιμα εργαλεία για να επιλέξετε τη βέλτιστη ρύθμιση μνήμης για εσάς όπως αυτή.

Να συμπεράνω…

Ένα πράγμα που πρέπει να εξεταστεί είναι κατά πόσον είναι απαραίτητη η εφαρμογή της μεθόδου επαναχρησιμοποίησης σύνδεσης. Εάν η λειτουργία λάμδα σας χρησιμοποιείται μόνο σπάνια, όπως μία φορά την ημέρα, τότε δεν θα ωφεληθείτε από τη βελτιστοποίηση για θερμές εκκινήσεις. Συχνά υπάρχει συμβιβασμός μεταξύ της βελτιστοποίησης της απόδοσης και της αναγνωσιμότητας του κώδικα - ο όρος "uglification" μιλάει για τον εαυτό του! Επιπλέον, η προσθήκη συνολικών μεταβλητών στον κώδικα σας για την επαναχρησιμοποίηση συνδέσεων σε άλλες υπηρεσίες μπορεί να κάνει τον κώδικα σας πιο δύσκολο να εντοπιστεί. Δύο ερωτήσεις έρχονται στο μυαλό:

  • Το νέο μέλος της ομάδας θα καταλάβει τον κωδικό σας;
  • Θα μπορείτε εσείς και η ομάδα σας να διορθώσετε τον κώδικα στο μέλλον;

Αλλά οι πιθανότητες είναι ότι έχετε επιλέξει το Lambda για την κλίμακά του και θέλετε υψηλές επιδόσεις και χαμηλό κόστος, ώστε να βρείτε την ισορροπία που ταιριάζει στις ανάγκες της ομάδας σας.

Αυτές οι απόψεις είναι αυτές του συγγραφέα. Εκτός αν αναφέρεται διαφορετικά σε αυτή τη θέση, το Capital One δεν είναι συνδεδεμένο με, ούτε υποστηρίζεται από καμία από τις προαναφερθείσες εταιρείες. Όλα τα εμπορικά σήματα και άλλη πνευματική ιδιοκτησία που χρησιμοποιούνται ή εμφανίζονται είναι ιδιοκτησία των αντίστοιχων κατόχων τους. Αυτό το άρθρο είναι © 2019 Capital One.