Συνέπεια κατανεμημένων συστημάτων — DedSec Project
Συνέπεια κατανεμημένων συστημάτων — διπλά συμβάντα και παλιές αναγνώσεις Το πρόβλημα Δύο αντίγραφα δεδομένων εμφανίζουν έναν μετρητή που προκύπτει από συμβάντα παραγγελιών. Το αντίγραφο A…
Συνέπεια κατανεμημένων συστημάτων — διπλά συμβάντα και παλιές αναγνώσεις
Το πρόβλημα
Δύο αντίγραφα δεδομένων εμφανίζουν έναν μετρητή που προκύπτει από συμβάντα παραγγελιών. Το αντίγραφο A λαμβάνει την παραγγελία order-7, αλλά το B δεν την έχει λάβει ακόμη. Μία ανάγνωση από το B επιστρέφει παλιότερη τιμή παρότι το A έχει ήδη ενημερωθεί. Η ενδεχόμενη συνέπεια επιτρέπει προσωρινή απόκλιση, με την προϋπόθεση ότι ο συγχρονισμός τελικά θα ολοκληρωθεί. Η εγγύηση «διάβασε όσα έγραψες» απαιτεί ο δημιουργός της αλλαγής να μη δει παλαιότερη κατάσταση. Η γραμμικοποιησιμότητα είναι ισχυρότερη: κάθε πράξη πρέπει να εμφανίζεται ότι ολοκληρώθηκε σε μία στιγμή ανάμεσα στην έναρξη και τη λήξη της.
Εκτελέσιμο μοντέλο Python 3
Αποθήκευσε ως replica_lab.py και εκτέλεσε python3 replica_lab.py. Δεν χρησιμοποιεί δίκτυο ή πραγματικό σύστημα συναίνεσης. Είναι ένα περιορισμένο μοντέλο παράδοσης συμβάντων που ελέγχει διπλότυπα και προσωρινή διαφωνία.
class Replica:
def __init__(self):
self.total = 0
self.events = set()
self.version = 0
def apply(self, event):
if event["id"] in self.events:
return False
self.events.add(event["id"])
self.total += event["delta"]
self.version += 1
return True
a, b = Replica(), Replica()
event = {"id": "order-7", "delta": 2}
assert a.apply(event)
assert not a.apply(event)
assert a.total == 2 and b.total == 0
assert b.apply(event) and b.total == 2
assert not b.apply(event)
assert a.events == b.events
print("PASS: stale read, duplicate delivery, convergence")
Όρια της προσομοίωσης
Το αναγνωριστικό κάθε συμβάντος αποτρέπει δεύτερη εφαρμογή στο ίδιο αντίγραφο, εφόσον διατηρείται το σύνολο αναγνωριστικών. Αυτό δεν σημαίνει ότι το δίκτυο παραδίδει κάθε μήνυμα ακριβώς μία φορά. Το παράδειγμα συγκλίνει όταν το B παραλάβει το συμβάν. Δεν αντιμετωπίζει συγκρουόμενες ταυτόχρονες εγγραφές, απώλεια μόνιμης αποθήκευσης, εκλογή αρχηγού ή κακόβουλα μέλη. Για συγχώνευση ανεξάρτητων αλλαγών απαιτείται κατάλληλος κανόνας ή κοινά διατεταγμένο αρχείο συμβάντων.
Πειράματα
- Παράδωσε το συμβάν μόνο στο A και διάβασε το B. Έπειτα παράδωσέ το δύο φορές στο B και κατέγραψε μετρητές και εκδόσεις.
- Πρόσθεσε δεύτερο συμβάν με διαφορετικό αναγνωριστικό και δοκίμασε αντίστροφη σειρά παράδοσης. Σύγκρινε τις τελικές τιμές.
- Προσομοίωσε επανεκκίνηση που χάνει το σύνολο ήδη γνωστών συμβάντων. Επανεκτέλεσε order-7 και εξήγησε πού πρέπει να αποθηκεύεται μόνιμα η πληροφορία αποφυγής διπλοτύπων.
- Σχεδίασε χρονικό διάγραμμα όπου ο ίδιος χρήστης γράφει στο A και διαβάζει από το B. Εξήγησε ποια εγγύηση παραβιάζεται.
Παραδοτέα: PASS, πίνακας γεγονότων και εκδόσεων, παραδοχή τελικής παράδοσης και σαφής περιορισμός του μοντέλου. Ένα λεξικό Python δεν αποτελεί σύστημα κατανεμημένης συναίνεσης.