Βέλτιστες πρακτικές χωρίς διακομιστές

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

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

Και θυμηθείτε ότι οι βέλτιστες πρακτικές δεν είναι "οι μόνες πρακτικές". Οι βέλτιστες πρακτικές βασίζονται σε ένα σύνολο υποκείμενων υποθέσεων. Εάν αυτές οι υποθέσεις δεν ταιριάζουν με τη χρήση σας, τότε αυτές οι βέλτιστες πρακτικές ίσως δεν ταιριάζουν.

Η βασική παραδοχή μου είναι ότι όλοι χτίζουν την αίτησή τους για να είναι σε θέση να τρέχουν σε κλίμακα (ακόμα και αν δεν καταλήγουν να τρέχουν σε κλίμακα).

Αυτές είναι οι βέλτιστες πρακτικές μου, όπως τις βλέπω.

Κάθε λειτουργία πρέπει να κάνει μόνο ένα πράγμα

Πρόκειται για σφάλμα λειτουργίας και απομόνωση κλίμακας.

Κάνοντας τον άλλο τρόπο, αν χρησιμοποιείτε μια εντολή διακόπτη στη λειτουργία σας, πιθανώς το κάνετε λάθος.

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

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

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

Οι λειτουργίες δεν καλούν άλλες λειτουργίες

Λειτουργίες που καλούν άλλες λειτουργίες είναι ένα αντίτυπο.

Υπάρχουν πολύ λίγες αιχμές όπου αυτό είναι ένα έγκυρο μοτίβο, αλλά δεν είναι εύκολα κατανεμημένες.

Βασικά, μην το κάνετε. Διπλασιάζετε απλώς το κόστος σας και καθιστάτε πιο περίπλοκη την εκκαθάριση και απομακρύνετε την αξία της απομόνωσης των λειτουργιών σας.

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

Χρησιμοποιήστε όσο το δυνατόν λιγότερες βιβλιοθήκες στις λειτουργίες σας (κατά προτίμηση μηδέν)

Αυτό μου φαίνεται προφανές.

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

Όσο περισσότερο κωδικό έχετε, τόσο πιο αργή είναι η ψυχρή εκκίνηση.

Όσο περισσότερες βιβλιοθήκες χρειάζονται δημιουργία στιγμιότυπων, τόσο πιο αργή είναι η ψυχρή εκκίνηση.

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

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

Τα πράγματα όπως το express είναι κατασκευασμένα για διακομιστές, και οι εφαρμογές χωρίς διακομιστές δεν χρειάζονται όλα τα στοιχεία εκεί. Γιατί λοιπόν να εισαγάγετε όλο τον κώδικα και τις εξαρτήσεις; Γιατί να φέρει περιττό κώδικα; Δεν είναι μόνο κάτι που δεν θα τρέξει ποτέ, αλλά θα μπορούσε να εισάγει έναν κίνδυνο ασφάλειας.

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

Αποφύγετε τη χρήση υπηρεσιών που βασίζονται στη σύνδεση π.χ. RDBMS

Ακριβώς μην το κάνετε, εκτός αν χρειαστεί.

Αυτός θα με φέρει στο μέγιστο κόπο. Πολλοί άνθρωποι στο διαδίκτυο θα μεταπηδήσουν στο "αλλά το RDBMS είναι αυτό που γνωρίζουμε".

Δεν πρόκειται για RDBMS. Πρόκειται για τις συνδέσεις.

Ο serverless λειτουργεί καλύτερα με τις υπηρεσίες παρά με τις συνδέσεις.

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

Για να είμαι ειλικρινής, οι άνθρωποι χωρίς διακομιστές δεν είναι εναντίον του RDBMS, είναι ενάντια στις συνδέσεις. Οι συνδέσεις χρειάζονται χρόνο και αν φανταστείτε μια κλιμάκωση λειτουργίας, κάθε περιβάλλον λειτουργίας χρειάζεται μια σύνδεση και εισάγετε τόσο ένα εμπόδιο και ένα I / O περιμένετε στην κρύα εκκίνηση της λειτουργίας. Είναι περιττό.

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

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

Μία λειτουργία ανά διαδρομή (αν χρησιμοποιείτε HTTP)

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

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

Αλλά τότε, χρησιμοποιούσατε κάποιο είδος εργαλείου διαχείρισης παραμέτρων ούτως ή άλλως για να τρέξετε τα πάντα; Και έχετε ήδη χρησιμοποιήσει τα εργαλεία CI και CD κάπως σωστά; Πρέπει ακόμα να DevOps με serverless.

Μάθετε να χρησιμοποιείτε μηνύματα και ουρές (async FTW)

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

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

Βασικά, μάθετε πώς λειτουργούν τα κατανεμημένα συστήματα.

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

Ροές δεδομένων, όχι λίμνες δεδομένων

Σε ένα σύστημα χωρίς διακομιστές, τα δεδομένα σας ρέουν μέσω του συστήματός σας. Μπορεί να καταλήξει σε μια λίμνη δεδομένων, αλλά η πιθανότητα είναι ότι ενώ βρίσκεται στο σύστημα χωρίς διακομιστές σας, είναι σε κάποιο είδος ροής. Έτσι αντιμετωπίστε όλα τα δεδομένα όπως είναι σε κίνηση, όχι σε ηρεμία σε κανένα σημείο.

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

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

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

Ξέρω ότι αυτό το σημείο είναι λίγο πιο "έξω εκεί" από άλλους, αλλά δεν είναι ένα ευθεία προς τα εμπρός για να κάνει.

Απλά η κωδικοποίηση της κλίμακας είναι ένα λάθος, πρέπει να εξετάσετε πώς θα κλιμακωθεί

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

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

Έτσι, μην ρίχνετε μόνο μια εφαρμογή μέσα, και στη συνέχεια φανταστείτε ότι θα λειτουργήσει το ίδιο υπό φορτίο. Η κατανόηση της αίτησής σας υπό φορτίο εξακολουθεί να αποτελεί μέρος της εργασίας.

συμπέρασμα

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

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

Προσβλέπουμε να ακούσουμε τις σκέψεις των άλλων ανθρώπων. Σίγουρα θα πάρω μια πλημμύρα ανθρώπων που μου λένε ότι κάνω λάθος για το RDBMS. Όπως και με τα δοχεία, δεν μίσω RDBMS, αλλά μου αρέσει να χρησιμοποιώ τα σωστά εργαλεία για τις σωστές εργασίες. Γνωρίστε τα εργαλεία σας!