Προγραμματισμός

Υπολογισμός χωρίς διακομιστή με AWS Lambda, Μέρος 1

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

Μετά την επισκόπηση, θα λάβετε μια πρακτική εισαγωγή στο AWS Lambda, η οποία θεωρείται από πολλούς την πρεμιέρα λύση που βασίζεται σε Java για υπολογιστές χωρίς διακομιστές σήμερα. Στο Μέρος 1, θα χρησιμοποιήσετε το AWS Lambda για να δημιουργήσετε, να αναπτύξετε και να δοκιμάσετε την πρώτη σας λειτουργία Lambda στην Java. Στο Μέρος 2, θα ενσωματώσετε τη λειτουργία Lambda με το DynamoDB και, στη συνέχεια, θα χρησιμοποιήσετε το AWS SDK για να ενεργοποιήσετε τις λειτουργίες Lambda σε μια εφαρμογή Java.

Τι είναι ο υπολογιστής χωρίς διακομιστή;

Πέρυσι, μιλούσα με μια εταιρεία πρακτικής για διαφορετικά αρχιτεκτονικά μοτίβα και ανέφερα αρχιτεκτονική χωρίς διακομιστές. Γρήγορα σημείωσε ότι όλες οι εφαρμογές απαιτούν διακομιστή και δεν μπορούν να εκτελεστούν με λεπτό αέρα. Ο ασκούμενος είχε ένα σημείο, ακόμα κι αν έλειπε δική μου. Ο υπολογιστής χωρίς διακομιστή δεν είναι μια μαγική πλατφόρμα για την εκτέλεση εφαρμογών.

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

Τι κοστίζει το AWS Lambda;

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

  • Οι πρώτες εκατομμύρια εκτελέσεις σας ανά μήνα είναι δωρεάν και, στη συνέχεια, πληρώνετε 0,20 $ ανά εκατομμύριο εκτελέσεις στη συνέχεια (0,0000002 $ ανά αίτημα).
  • Η διάρκεια υπολογίζεται από τη στιγμή που ο κώδικάς σας αρχίζει να εκτελείται έως ότου επιστρέψει ένα αποτέλεσμα, στρογγυλοποιημένο στα πλησιέστερα 100ms. Το ποσό που χρεώνεται βασίζεται στο ποσό της μνήμης RAM που έχει εκχωρηθεί στη συνάρτηση, όπου το κόστος είναι 0,00001667 $ για κάθε GB-δευτερόλεπτο.

Οι λεπτομέρειες τιμολόγησης και οι δωρεάν κατανομές επιπέδου είναι ελαφρώς πιο περίπλοκες από ό, τι υποδηλώνει η επισκόπηση. Επισκεφτείτε το επίπεδο τιμών για να δείτε μερικά σενάρια τιμολόγησης.

Για να πάρετε μια ιδέα για το πώς λειτουργεί ο υπολογιστής χωρίς διακομιστές, ας ξεκινήσουμε με το μοντέλο εκτέλεσης υπολογιστών χωρίς διακομιστές, το οποίο απεικονίζεται στο Σχήμα 1.

Στίβεν Χάινς

Με λίγα λόγια, αυτό είναι το μοντέλο εκτέλεσης χωρίς διακομιστή:

  1. Ένας πελάτης υποβάλλει ένα αίτημα στην πλατφόρμα υπολογιστών χωρίς διακομιστή για να εκτελέσει μια συγκεκριμένη λειτουργία.
  2. Η πλατφόρμα υπολογιστών χωρίς διακομιστή ελέγχει πρώτα για να δει εάν η λειτουργία εκτελείται σε οποιονδήποτε από τους διακομιστές της. Εάν η λειτουργία δεν εκτελείται ήδη, τότε η πλατφόρμα φορτώνει τη συνάρτηση από μια αποθήκευση δεδομένων.
  3. Στη συνέχεια, η πλατφόρμα αναπτύσσει τη λειτουργία σε έναν από τους διακομιστές της, οι οποίοι είναι προεπιλεγμένοι με περιβάλλον εκτέλεσης που μπορεί να εκτελέσει τη λειτουργία.
  4. Εκτελεί τη λειτουργία και καταγράφει το αποτέλεσμα.
  5. Επιστρέφει το αποτέλεσμα στον πελάτη.

Μερικές φορές ο υπολογιστής χωρίς διακομιστή ονομάζεται Function as a Service (FaaS), επειδή η λεπτομέρεια του κώδικα που δημιουργείτε είναι λειτουργία. Η πλατφόρμα εκτελεί τη λειτουργία σας στον δικό της διακομιστή και ενορχηστρώνει τη διαδικασία μεταξύ αιτημάτων λειτουργίας και απαντήσεων λειτουργίας.

Νανοϋπηρεσίες, επεκτασιμότητα και τιμή

Τρία πράγματα έχουν σημασία για τον υπολογιστή χωρίς διακομιστές: την αρχιτεκτονική της νανοεξυπηρέτησης. το γεγονός ότι είναι πρακτικά απείρως κλιμακούμενο · και το μοντέλο τιμολόγησης που σχετίζεται με αυτό που είναι σχεδόν άπειρη επεκτασιμότητα. Θα διερευνήσουμε κάθε έναν από αυτούς τους παράγοντες.

Νανοϋπηρεσίες

Έχετε ακούσει για μικροϋπηρεσίες και πιθανότατα γνωρίζετε για εφαρμογές 12 παραγόντων, αλλά οι λειτουργίες χωρίς διακομιστές κάνουν το παράδειγμα της διάσπασης ενός στοιχείου στα συστατικά μέρη του σε ένα εντελώς νέο επίπεδο. Ο όρος "νανοϋπηρεσίες" δεν είναι αναγνωρισμένος από τη βιομηχανία όρος, αλλά η ιδέα είναι απλή: κάθε νανοεξυπηρέτηση θα πρέπει να εφαρμόζει μία μόνο ενέργεια ή ευθύνη Για παράδειγμα, εάν θέλετε να δημιουργήσετε ένα widget, η πράξη της δημιουργίας θα είναι η δική της νανοσέρβις. εάν θέλετε να ανακτήσετε ένα widget, η πράξη ανάκτησης θα ήταν επίσης μια νανοεξυπηρέτηση. και αν θέλατε να κάνετε μια παραγγελία για ένα widget, αυτή η παραγγελία θα ήταν μια ακόμη νανοεξυπηρέτηση.

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

Μικροσυσκευές έναντι νανοϋπηρεσιών

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

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

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

Επεκτασιμότητα

Εκτός από την εισαγωγή ενός νέου αρχιτεκτονικού παραδείγματος, οι πλατφόρμες υπολογιστών χωρίς διακομιστές παρέχουν πρακτικά άπειρη επεκτασιμότητα. Λέω "πρακτικά" γιατί δεν υπάρχει κάτι τέτοιο στα αληθεια άπειρη επεκτασιμότητα. Ωστόσο, για όλους τους πρακτικούς σκοπούς, οι πάροχοι υπολογιστών χωρίς διακομιστές όπως η Amazon μπορούν να χειριστούν περισσότερο φορτίο από ό, τι θα μπορούσατε να τους ρίξετε. Εάν επρόκειτο να διαχειριστείτε την αναβάθμιση των δικών σας διακομιστών (ή εικονικών μηχανών που βασίζονται σε σύννεφο) για να καλύψετε την αυξημένη ζήτηση, θα πρέπει να παρακολουθείτε τη χρήση, να προσδιορίζετε πότε να ξεκινήσετε περισσότερους διακομιστές και να προσθέσετε περισσότερους διακομιστές στο σύμπλεγμα σας τη σωστή στιγμή. Ομοίως, όταν μειωθεί η ζήτηση, θα πρέπει να μειώσετε χειροκίνητα. Με τον υπολογιστή χωρίς διακομιστές, πείτε στην πλατφόρμα υπολογιστών χωρίς διακομιστή τον μέγιστο αριθμό αιτήσεων ταυτόχρονης λειτουργίας που θέλετε να εκτελέσετε και η πλατφόρμα κάνει την κλιμάκωση για εσάς.

Τιμολόγηση

Τέλος, το μοντέλο τιμολόγησης χωρίς διακομιστές σάς επιτρέπει να κλιμακώσετε το λογαριασμό σας στο cloud με βάση τη χρήση. Όταν έχετε ελαφριά χρήση, ο λογαριασμός σας θα είναι χαμηλός (ή μηδέν εάν παραμείνετε στην ελεύθερη εμβέλεια). Φυσικά, ο λογαριασμός σας θα αυξηθεί με τη χρήση, αλλά ελπίζουμε ότι θα έχετε επίσης νέα έσοδα για να υποστηρίξετε τον υψηλότερο λογαριασμό σας στο cloud. Αντιθέτως, εάν επρόκειτο να διαχειριστείτε τους δικούς σας διακομιστές, θα πρέπει να πληρώσετε ένα βασικό κόστος για να εκτελέσετε τον ελάχιστο απαιτούμενο αριθμό διακομιστών. Καθώς η χρήση αυξανόταν, θα αυξήσετε τις αυξήσεις ολόκληρων των διακομιστών, αντί των αυξήσεων μεμονωμένων κλήσεων λειτουργίας. Το μοντέλο υπολογιστικής τιμολόγησης χωρίς διακομιστή είναι άμεσα ανάλογο με τη χρήση σας.

AWS Lambda για υπολογιστές χωρίς διακομιστές

Το AWS Lambda είναι μια πλατφόρμα υπολογιστών χωρίς διακομιστές που υλοποιείται πάνω από πλατφόρμες Amazon Web Services όπως οι EC2 και S3. Το AWS Lambda κρυπτογραφεί και αποθηκεύει τον κωδικό σας στο S3. Όταν ζητείται να εκτελεστεί μια λειτουργία, δημιουργεί ένα "κοντέινερ" χρησιμοποιώντας τις προδιαγραφές χρόνου εκτέλεσης, την αναπτύσσει σε μία από τις παρουσίες EC2 στο σύμπλεγμα υπολογιστών και εκτελεί αυτήν τη λειτουργία. Η διαδικασία φαίνεται στο Σχήμα 2.

Στίβεν Χάινς

Όταν δημιουργείτε μια συνάρτηση Lambda, τη διαμορφώνετε σε AWS Lambda, καθορίζοντας πράγματα όπως το περιβάλλον χρόνου εκτέλεσης (θα χρησιμοποιήσουμε το Java 8 για αυτό το άρθρο), πόση μνήμη θα εκχωρηθεί σε αυτήν, ρόλους διαχείρισης ταυτότητας και πρόσβασης και τη μέθοδο εκτέλεση. Το AWS Lambda χρησιμοποιεί τη διαμόρφωσή σας για να ρυθμίσει ένα κοντέινερ και να αναπτύξει το κοντέινερ σε μια παρουσία EC2. Στη συνέχεια εκτελεί τη μέθοδο που έχετε καθορίσει, με τη σειρά του πακέτου, της κλάσης και της μεθόδου.

Τη στιγμή αυτής της γραφής, μπορείτε να δημιουργήσετε λειτουργίες Lambda σε Node, Java, Python και πιο πρόσφατα, C #. Για τους σκοπούς αυτού του άρθρου θα χρησιμοποιήσουμε Java.

Τι είναι η λειτουργία Lambda;

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

Λειτουργίες εκτέλεσης χωρίς διακομιστή

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

Δούλεψα με μια πολύ μεγάλη εταιρεία που αξιοποίησε αυτήν τη λύση για φωτογράφους που καλύπτουν μαραθώνιο. Οι φωτογράφοι πήγαιναν στο μάθημα φωτογραφίζοντας. Όταν οι κάρτες μνήμης τους ήταν γεμάτες, φόρτωσαν τις εικόνες σε ένα φορητό υπολογιστή και ανέβασαν τα αρχεία στο S3. Καθώς ανεβάστηκαν εικόνες, οι λειτουργίες Lambda εκτελέστηκαν για αλλαγή μεγέθους, υδατογράφημα και προσθήκη αναφοράς για κάθε εικόνα στον δρομέα της στη βάση δεδομένων.

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

Εκτός από την ανταπόκριση σε αρχεία που ανεβαίνουν στο S3, το lambdas μπορεί να ενεργοποιηθεί από άλλες πηγές, όπως εγγραφές που εισάγονται σε μια βάση δεδομένων DynamoDB και αναλυτικές ροές πληροφοριών από το Amazon Kinesis. Θα δούμε ένα παράδειγμα με το DynamoDB στο Μέρος 2.

Το AWS Lambda λειτουργεί στην Java

Τώρα που γνωρίζετε λίγα πράγματα για υπολογιστές χωρίς διακομιστές και AWS Lambda, θα σας καθοδηγήσω στη δημιουργία μιας λειτουργίας AWS Lambda στην Java.

λήψη Λάβετε τον κώδικα Πηγαίος κώδικας για το παράδειγμα εφαρμογής για αυτό το σεμινάριο, "Υπολογισμός χωρίς διακομιστή με AWS Lambda." Δημιουργήθηκε από τον Steven Haines για το JavaWorld.

Υλοποίηση λειτουργιών Lambda

Μπορείτε να γράψετε μια συνάρτηση Lambda με έναν από τους δύο τρόπους:

  • Η συνάρτηση μπορεί να λάβει μια ροή εισόδου στον πελάτη και να γράψει σε μια ροή εξόδου πίσω στον πελάτη.
  • Η συνάρτηση μπορεί να χρησιμοποιήσει μια προκαθορισμένη διεπαφή, οπότε το AWS Lambda θα αποστειρώσει αυτόματα τη ροή εισόδου σε ένα αντικείμενο, θα το περάσει στη λειτουργία σας και θα σειριοποιήσει την απόκριση της λειτουργίας σας πριν την επιστρέψει στον πελάτη.

Ο ευκολότερος τρόπος για να εφαρμόσετε μια λειτουργία AWS Lambda είναι να χρησιμοποιήσετε μια προκαθορισμένη διεπαφή. Για Java, πρέπει πρώτα να συμπεριλάβετε την ακόλουθη βιβλιοθήκη πυρήνα AWS Lambda στο έργο σας (σημειώστε ότι αυτό το παράδειγμα χρησιμοποιεί το Maven):

 com.amazonaws aws-lambda-java-core 1.1.0 

Στη συνέχεια, ζητήστε από την τάξη σας να εφαρμόσει την ακόλουθη διεπαφή:

Λίστα 1. RequestHandler.java

 δημόσια διεπαφή RequestHandler {/ ** * Αντιμετωπίζει αίτημα συνάρτησης Lambda * @param input Η είσοδος συνάρτησης Lambda * @param konteks Το αντικείμενο περιβάλλοντος περιβάλλοντος εκτέλεσης Lambda. * @ return Η έξοδος της συνάρτησης Lambda * / public O handleRequest (I input, Context konteks). } 

ο Αίτημα χειριστή διεπαφή ορίζει μια μόνο μέθοδο: handleRequest (), το οποίο μεταδίδεται ένα αντικείμενο εισαγωγής και ένα Συμφραζόμενα αντικείμενο και επιστρέφει ένα αντικείμενο εξόδου. Για παράδειγμα, εάν επρόκειτο να ορίσετε ένα Αίτηση τάξη και α Απάντηση τάξη, θα μπορούσατε να εφαρμόσετε το λάμδα σας ως εξής:

 δημόσια τάξη Το MyHandler εφαρμόζει RequestHandler {public Response handleRequest (Request request, Context konteks) {...}} 

Εναλλακτικά, εάν θέλετε να παρακάμψετε την προκαθορισμένη διεπαφή, θα μπορούσατε να χειριστείτε χειροκίνητα το InputStream και Έξοδος ροής τον εαυτό σας, εφαρμόζοντας μια μέθοδο με την ακόλουθη υπογραφή:

 public void handleRequest (InputStream inputStream, OutputStream outputStream, Context konteks) ρίχνει το IOException {...} 

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