Table of Contents

Κατανόηση της πρόκλησης συνέπειας δεδομένων σε καταστήματα δεδομένων χωρίς Server

Τα καταστήματα δεδομένων χωρίς Server, όπως η Amazon DynamoDB, η Azure Cosmos DB και η Google Cloud Firestore προσφέρουν αυτόματη ρύθμιση, τιμολόγηση επί πληρωμή ανά χρήση και μειωμένη λειτουργική διαχείριση. Ωστόσο, η κατανεμημένη φύση τους εισάγει θεμελιώδεις εμπορικές συναλλαγές σε συνέπεια δεδομένων. Όταν μια εφαρμογή διαβάζει δεδομένα αμέσως μετά τη συγγραφή της, ο χρήστης αναμένει να δει την τελευταία αξία. Σε ένα παγκόσμιο κατανεμημένο σύστημα, η επίτευξη αυτής της εγγύησης γίνεται μη τριμερής. Το θεώρημα CAP μας υπενθυμίζει ότι ένα διανεμημένο κατάστημα δεδομένων μπορεί να παρέχει μόνο δύο από τις τρεις εγγυήσεις: Συνέπεια, Διαθεσιμότητα και Χωρισμός Ανοχή. Οι υπηρεσίες χωρίς Server είναι συνήθως προτεραιότητα στη διαθεσιμότητα και ανοχή χωρισμάτων, προσφέροντας Συναυλία εξ ορισμού. Κατανόηση αυτού του εμπορίου-off είναι το πρώτο βήμα προς τις αξιόπιστες εφαρμογές.

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

Μοντέλα συνέπειας σε καταστήματα χωρίς εξυπηρετητή

Ισχυρή Συνέπεια

Στα συστήματα χωρίς server, αυτό επιτυγχάνεται συχνά με την ανάγνωση από το πρωτεύον αντίγραφο ή με τη χρήση πρωτοκόλλων που βασίζονται στην απαρτία. Υπηρεσίες όπως η υποστήριξη DynamoDB ] με ισχυρή συνέπεια διαβάζουν[ (με πρόσθετο κόστος και λανθάνουσα δυναμικότητα) και η Azure Cosmos DB προσφέρει ισχυρή συνέπεια για τους παγκοσμίως κατανεμημένους λογαριασμούς χρησιμοποιώντας πολλαπλών master αντιγραφή. Χρησιμοποιήστε ισχυρή συνέπεια όταν οι οικονομικές συναλλαγές, η εξακρίβωση της ταυτότητας του χρήστη, ή τα συστήματα κρατήσεων απαιτούν απόλυτη ακρίβεια.

Συνέπεια σε γεγονότα

Η συνέπεια των γεγονότων είναι η προεπιλογή για τα περισσότερα καταστήματα δεδομένων χωρίς server. Σημαίνει ότι αν δεν γίνει καμία νέα εγγραφή σε ένα στοιχείο δεδομένων, τελικά (συνήθως μέσα σε χιλιοστά του δευτερολέπτου ή δευτερόλεπτα) όλα τα αντίγραφα θα συγκλίνουν στην ίδια τιμή. Αυτό το μοντέλο παρέχει την καλύτερη διαθεσιμότητα και χαμηλότερη λανθάνουσα λανθάνουσα λανθάνουσα λανθάνουσα . Είναι ιδανικό για διαβασμένους-βαρείς φόρτους εργασίας, καταλόγους προϊόντων, και συστήματα καταγραφής όπου τα στοιχεία stalle είναι αποδεκτά για μικρά παράθυρα.

Αιτιώδης Συνέπεια

Αν η λειτουργία Α (ενημέρωση εικόνας προφίλ) συμβεί πριν από τη λειτουργία Β (δημοσιεύστε σχόλιο αναφερόμενη στην εικόνα), τότε οποιοσδήποτε παρατηρητής θα δει το Α πριν από το Β. Αυτό το μοντέλο βρίσκεται μεταξύ ισχυρής και παρεπόμενης συνέπειας και υποστηρίζεται από υπηρεσίες όπως [[LFT:0]]]Google Cloud Datastore[[LFT:1]]. Είναι χρήσιμο για συνεργατικές επεξεργασίες, κοινωνικές ζωοτροφές και εφαρμογές συνομιλίας όπου τα γεγονότα παραγγέλνουν θέματα.

Βέλτιστες Πρακτικές για τη Διατήρηση της Συνέπειας

1. Επιλέξτε το κατάλληλο μοντέλο συνέπειας για κάθε λειτουργία

Αντί να επιλέξετε ένα ενιαίο επίπεδο συνέπειας για ολόκληρη την εφαρμογή σας, σχεδιάστε κάθε κρίσιμη ανάγνωση ή γράψτε λειτουργία με τη δική της απαίτηση συνέπειας. Στο DynamoDB, μπορείτε να καθορίσετε [[LFT:0]] για μεμονωμένες ή [[LFT:2]] κλήσεις ενώ αφήνοντας άλλες ενδείξεις τελικά συνεπή. Αυτή η υβριδική προσέγγιση ισορροπεί την απόδοση και την ορθότητα. Καταγράψτε τις αποφάσεις σας και δοκιμάστε τις υπό φορτίο για να διασφαλίσετε ότι η λανθάνουσα ισχύς παραμένει εντός αποδεκτών ορίων.

2. Χρησιμοποιήστε διανεμημένες συναλλαγές με Sagas ή δύο-φασών επιτροπή

Όταν μια επιχειρηματική διαδικασία καλύπτει πολλαπλά καταστήματα δεδομένων ή υπηρεσίες, χρειάζεστε έναν μηχανισμό για να διατηρήσετε την ατομικότητα. ⁇ όπως το πρωτόκολλο της διφασικής δέσμευσης (2PC) ⁇ ώστε κάθε συμμετέχουσα πλευρά να δεσμεύει ή να ματαιώνει μαζί. Ωστόσο, οι 2PC μπορούν να είναι αργές και να μειώσουν τη διαθεσιμότητα. Μια εναλλακτική λύση είναι το Saga pattern[], όπου κάθε πράξη εκπέμπει ένα γεγονός που ενεργοποιεί την αντιστάθμιση ενεργειών αν κάτι αποτύχει. Πολλές πλατφόρμες χωρίς εξυπηρετητές προσφέρουν ενσωματωμένη υποστήριξη συναλλαγών: DynamoDB συναλλαγές] καλύπτουν έως 25 ενέργειες σε πολλαπλά αντικείμενα, ενώ η Cosmos DB υποστηρίζει συναλλαγές.

3. Εφαρμογή στρατηγικών επίλυσης συγκρούσεων

Τα καταστήματα χωρίς Server χρησιμοποιούν συνήθως [[LFT:0]] τους τελευταίους νικητές (LWW), οι οποίοι διατηρούν την πιο πρόσφατη χρονοσφραγίδα. Ενώ τα απλά, τα LWW μπορούν να χάσουν δεδομένα αν τα ρολόγια είναι εκτός συγχρονισμού. Για πλουσιότερη σημασιολογία, χρησιμοποιήστε τα διανυσματικά διανυσματικά της έκδοσης ή τα CRDT (Ελεύθερα από Conflict) (Ελεύθερα Επαναλαμβανόμενα από τη σύγκρουση είδη δεδομένων)[]. Τα υπό όρους ενημερώσεις και τα πεδία έκδοσης της DynamoDB σας επιτρέπουν να υλοποιήσετε αισιόδοξο κλείδωμα με προσαρμοσμένη επίλυση συγκρούσεων.

4. Εξουδετέρωση των λειτουργιών και των επαναχρησιμοποιήσεων

Οι αποτυχίες δικτύου ή τα παροδικά λάθη μπορούν να προκαλέσουν επαναστάσεις πελατών, οι οποίες μπορεί να οδηγήσουν σε διπλή επεξεργασία. Ο σχεδιασμός των λειτουργιών να είναι [[LFT:0]] αδρανής[[[LFT:1]]] εξαλείφει αυτόν τον κίνδυνο. Για παράδειγμα, εκχωρήστε ένα μοναδικό κλειδί ιδεοδυναμίας σε κάθε αίτημα εγγραφής. Ο διακομιστής μπορεί στη συνέχεια να αποπροσανατολίσει αιτήματα που μοιράζονται το ίδιο κλειδί. Πολλοί χωρίς διακομιστή SDKs υποστηρίζουν το ιδεοδυναμικό γράφει εγγενώς. Συνδυάστε αυτό με εκθετική οπισθοδρόμηση και jitter σε επανεκκίνηση λογικής για να μειώσει τη διενέξεις και να διατηρήσει τη συνέπεια χωρίς να κατακλύσει το σύστημα υποστήριξης.

5. Παρακολούθηση ακεραιότητας δεδομένων με την αλλαγή ρευμάτων και ελέγχων

Σε ένα περιβάλλον χωρίς server, μπορείτε να χρησιμοποιήσετε [[LFT:0]] την αντιγραφή δεδομένων (CDC)[[LPT:1]] χαρακτηριστικά όπως DynamoDB Streams, Cosmos DB Change Feed, ή τους ακροατές του Firestore σε πραγματικό χρόνο για να παρακολουθούν όλες τις τροποποιήσεις. ⁇ μιας συνάρτησης λάμδα ή cloud για να επικυρώσετε ότι τα δεδομένα αναλλοίωτα κατέχουν μετά από κάθε αλλαγή. Για παράδειγμα, μια τραπεζική εφαρμογή μπορεί να εγγραφεί στις συναλλαγές λογαριασμού και να επαληθεύσει ότι το υπόλοιπο ισούται πάντα με το άθροισμα των πιστώσεων μείον χρεώσεις. Τα τακτικά ερωτήματα ελέγχου ⁇ που εκτελούνται σε ένα πρόγραμμα ⁇ μπορούν να ανιχνεύσουν τις ροές εργασίας που παρασύρονται και να πυροδοτήσουν διορθωτικές ροές εργασίας.

6. Βελτιστοποιήστε την αντιγραφή στοιχείων για την περίπτωση χρήσης σας

Η παγκόσμια αναπαραγωγή βελτιώνει τη λαχειοφάνεια των χρηστών ανά τον κόσμο αλλά αυξάνει το παράθυρο για την ασυνέπεια. ⁇ της αντιγραφής με το κατάλληλο επίπεδο συνέπειας και να εξετάσει τη χρήση []ενεργό-ενεργό[] vs. [ενεργό-παθητικό[]] τοπολογίες. Ενεργό-ενεργό (πολυ-master) προσφέρει χαμηλότερη λατινότητα γραφής αλλά απαιτεί ισχυρή επίλυση συγκρούσεων. Ενεργό-παθητικό (μονό πρωτεύον με αναγνωσμένα αντίγραφα) παρέχει ισχυρότερη συνέπεια για τα γραπτά ενώ εξακολουθεί να εξυπηρετεί αναγνώσεις από το πλησιέστερο αντίγραφο. Υπηρεσίες όπως ο Κόσμος DB επιτρέπουν την επιλογή από πέντε καλά καθορισμένα επίπεδα συνέπειας, από ισχυρά έως πιθανά, για να ταιριάζει με τους στόχους αντιγραφής της λατινότητάς σας.

Αρχιτεκτονικά Πρότυπα που Διατηρούν Συνέπεια

Διαχωρισμός ευθύνης εντολών ερωτήματος (CQRS)

Το CQRS διαχωρίζει τα μοντέλα από τα αναγνωσμένα μοντέλα, επιτρέποντας τη βελτιστοποίηση του καθενός ανεξάρτητα. Γράφει πηγαίνει σε ένα έντονα συνεπή κατάστημα? διαβάζει προέρχονται από τελικά συνεπείς προβολές. Αυτό το μοτίβο είναι ιδιαίτερα ισχυρό όταν συνδυάζεται με μια προμήθεια γεγονότων προσέγγιση, όπου όλες οι αλλαγές κατάσταση αποθηκεύονται ως αμετάβλητα γεγονότα. Τα διαβασμένα μοντέλα μπορούν να ξαναχτιστούν από το αρχείο καταγραφής γεγονότων αν προκύψουν προβλήματα συνέπειας. Martin Fowler του άρθρο στο CQRS παρέχει μια εξαιρετική επισκόπηση.

Εκδήλωση και συνέπεια γεγονότων

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

Μοτίβο Outbox για Αξιόπιστα Μηνύματα

Όταν μια λειτουργία χωρίς εξυπηρετητή γράφει σε μια βάση δεδομένων και στη συνέχεια στέλνει ένα μήνυμα σε μια ουρά, οι δύο λειτουργίες μπορεί να μην είναι ατομικές. Το μοτίβο outbox λύνει αυτό αποθηκεύοντας το μήνυμα στην ίδια βάση δεδομένων μέσα στην ίδια συναλλαγή. Μια ξεχωριστή διαδικασία (όπως ένας επεξεργαστής ρεύματος) διαβάζει το εξερχόμενο κιβώτιο και δημοσιεύει το μήνυμα. Αυτό εγγυάται ότι η βάση δεδομένων και η αποστολή μηνύματος είτε είναι δεσμευμένη είτε και οι δύο επανατοποθετούνται, διατηρώντας τη συνέπεια μεταξύ των υπηρεσιών. Οι πάροχοι SaaS όπως AWS Well-Architted περιγράφουν το μοτίβο outbox λεπτομερώς.

Χειρισμός ειδικών περιπτώσεων: Geo ⁇ Distribution και offline Γράφει

Οι εφαρμογές Mobile και IoT λειτουργούν συχνά εκτός σύνδεσης και συγχρονίζονται αργότερα. Οι SDKs χωρίς Server παρέχουν εκτός σύνδεσης επιμονή με συγχρονισμό που χειρίζεται τις συγκρούσεις μέσω προσαρμοσμένων διαλευκαντικών συγκρούσεων. Για παράδειγμα, το AWS AppSync με το DynamoDB μπορεί να συγχωνεύσει εκδόσεις με βάση χρονοσφραγίδες ή λογική καθορισμένη από τον πελάτη. Όταν χρησιμοποιείτε τέτοιες βιβλιοθήκες, πάντα να δοκιμάζετε τη λογική επίλυσης συγκρούσεων υπό πραγματικές - παγκόσμιες συνθήκες δικτύου και να παρακολουθείτε τον αριθμό των συγκρούσεων.

Για τη συνοχή πολλών περιοχών, χρησιμοποιήστε ομάδες συνέπειας[] όπου είναι δυνατόν ⁇ μια έννοια που υποστηρίζεται από το Cosmos DB που ομάδες σχετίζονται με τα στοιχεία έτσι ώστε να είναι πάντα αναπαραχθεί μαζί. Αυτό εμποδίζει σενάρια όπου η εικόνα προφίλ ενός χρήστη ενημερώνεται στην περιοχή Α αλλά η βιο ενημέρωση τους (στην ίδια ομάδα) δεν έχει φτάσει ακόμη στην περιοχή Β.

Στρατηγικές δοκιμών και επικύρωσης

Τα σφάλματα συνέπειας συχνά εμφανίζονται μόνο κάτω από κατανεμημένα φορτία. Γράψτε τις δοκιμές ολοκλήρωσης που τρέχουν ενάντια σε έναν πραγματικό εξομοιωτή χωρίς server ή cloud παράδειγμα και προσομοίωση ταυτόχρονη γράφει και διαβάζει. Εργαλεία όπως [[LFT:0]]Jepsen[[LPT:1]] μπορεί να επαληθεύσει ότι το κατάστημα δεδομένων σας συμπεριφέρεται σωστά κάτω από διαχωριστικά δικτύου. Για την παραγωγή, να εφαρμόσει τις εφαρμογές καναρίων και σταδιακά να μετατοπίσει την κυκλοφορία σε νέες διαδρομές κώδικα, ενώ παρακολουθεί τις μετρήσεις συνέπειας. Καθορίστε SLAs για τη σταθερότητα (μέγιστη αποδεκτή ηλικία των διαβασμένων δεδομένων) και μετρήστε τα με συνθετικές συναλλαγές.

Περίληψη

Η συνέπεια των δεδομένων σε καταστήματα χωρίς server απαιτεί εσκεμμένες αρχιτεκτονικές επιλογές. Κατανοώντας τα διαθέσιμα μοντέλα συνέπειας, χρησιμοποιώντας κατανεμημένες συναλλαγές ή το μοτίβο του έπους, σχεδιάζοντας τις αδύνατες λειτουργίες, και αξιοποιώντας μηχανισμούς επίλυσης συγκρούσεων, μπορείτε να οικοδομήσετε εφαρμογές που είναι τόσο κλιμακούμενες όσο και αξιόπιστες. Παρακολουθήστε τις εγγυήσεις συνέπειας του συστήματός σας μέσω ροών αλλαγών και ελέγχων, και υιοθετήστε μοτίβα όπως CQRS, προμήθεια γεγονότων, και το πρότυπο outbox για να διατηρήσετε την ακεραιότητα πέρα από τα όρια των υπηρεσιών. Με αυτές τις βέλτιστες πρακτικές, το σύστημα υποστήριξης χωρίς server θα παρέχει μια συνεπή, σωστή εμπειρία στους χρήστες του, ακόμη και καθώς αυτό κλιμακώνει για να χειριστεί την παγκόσμια κυκλοφορία.