GH GambleHub

CQRS και διαχωρισμός ανάγνωσης/εγγραφής

Τι είναι το CQRS

Το CQRS είναι μια αρχιτεκτονική προσέγγιση που διαχωρίζει το μοντέλο δεδομένων και τα συστατικά που είναι υπεύθυνα για τη γραφή (εντολές) και την ανάγνωση (ερωτήματα).
Η ιδέα: η διαδικασία αλλαγής κατάστασης βελτιστοποιείται για έγκυρες αναλλοίωτες και συναλλαγές, και ανάγνωση για γρήγορες, στοχευμένες προβολές και κλιμάκωση.

Κλειδιά> Οι εντολές αλλάζουν κατάσταση και επιστρέφουν το αποτέλεσμα της λειτουργίας. Τα αιτήματα διαβάζονται μόνο και δεν έχουν παρενέργειες.


Γιατί το χρειάζεσαι

Απόδοση ανάγνωσης: υλοποιημένες προβλέψεις για συγκεκριμένα σενάρια (ταινίες, αναφορές, καταλόγους).
Κρίσιμη σταθερότητα διαδρομής: καταγραφή απομονωμένων από «βαρέα» συνδέσμους και συγκεντρωτικά στοιχεία.
Ελευθερία επιλογής αποθήκευσης: OLTP για γραφή, OLAP/cache/μηχανές αναζήτησης για ανάγνωση.
Ταχεία εξέλιξη: Προσθήκη νέων απόψεων χωρίς τον κίνδυνο διακοπής των συναλλαγών.
Παρατηρησιμότητα και λογιστικός έλεγχος (ειδικά σε συνδυασμό με το Event Sourcing): είναι ευκολότερο να ανακτηθεί και να επαναληφθεί η κατάσταση.


Πότε να υποβάλετε αίτηση (και πότε όχι)

Κατάλληλο εάν:
  • Επικρατούν αναγνώσεις με διαφορετικές φέτες δεδομένων και σύνθετη ομαδοποίηση.
  • Η κρίσιμη διαδρομή καταγραφής πρέπει να είναι λεπτή και προβλέψιμη.
  • Για την ανάγνωση και τη γραφή απαιτούνται διαφορετικές SLO/SLA.
  • Απαιτείται απομόνωση της λογικής γραφής πεδίου από τις ανάγκες ανάλυσης/αναζήτησης.
Δεν είναι κατάλληλο εάν:
  • Το πεδίο είναι απλό, το φορτίο είναι χαμηλό. Η CRUD τα βγάζει πέρα.
  • Η ισχυρή συνέπεια μεταξύ ανάγνωσης και γραφής είναι υποχρεωτική για όλα τα σενάρια.
  • Η ομάδα είναι άπειρη και η επιχειρησιακή πολυπλοκότητα είναι απαράδεκτη.

Βασικές έννοιες

Η εντολή σκοπεύει να αλλάξει κατάσταση ('CreadeOrder', 'CapturePayment'). Ελέγχει τις αναλλοίωτες ουσίες.
Ανακτά δεδομένα ('GetDormById', 'ListUserTransactions'). Δεν υπάρχουν ανεπιθύμητες ενέργειες.
Υπόδειγμα καταγραφής: συγκεντρωτικά στοιχεία/αναλλοίωτα στοιχεία/συναλλαγές· αποθήκευση - σχέση/τιμή κλειδιού/καταγραφή γεγονότων.
Μοντέλο ανάγνωσης (προβολής): υλοποιημένοι πίνακες/ευρετήρια/κρύπτες, συγχρονισμένοι ασύγχρονα.
Συνέπεια: Συχνά, μεταξύ εγγραφής και ανάγνωσης. κρίσιμες διαδρομές - μέσω άμεσης ανάγνωσης από το μοντέλο γραφής.


Αρχιτεκτονική (σκελετός)

1. Εγγραφή: αποδέχεται εντολές, επικυρώνει αναλλοίωτες, καταγράφει αλλαγές (βάση δεδομένων ή γεγονότα).
2. Outbox/CDC: εγγυημένη δημοσίευση του γεγονότος των αλλαγών.
3. Επεξεργαστές προβολής: Ακούστε τα γεγονότα/CDC και ενημερώστε τα μοντέλα ανάγνωσης.
4. Υπηρεσία ανάγνωσης: εξυπηρετεί ερωτήματα από υλοποιημένες απόψεις/κρύπτες/αναζητήσεις.
5. Sagas/ενορχήστρωση: συντονισμός διασυνοριακών διαδικασιών.
6. Παρατήρηση: καθυστέρηση προβολής, ποσοστό επιτυχημένων εφαρμογών, DLQ.


Σχεδιασμός μοντέλου καταγραφής

Συγκεντρωτικά μεγέθη: σαφή όρια συναλλαγών (για παράδειγμα, 'Order', 'Payment', 'UserBalance').
Αναλλοίωτες: επισημοποιούνται (χρηματικά ποσά ≥ 0, μοναδικότητα, όρια).
Οι εντολές είναι ταυτόσημες με το κλειδί (για παράδειγμα, 'idempotency _ key').
Οι συναλλαγές έχουν ελάχιστο πεδίο εφαρμογής. εξωτερικές ανεπιθύμητες ενέργειες - μέσω outbox.

Παράδειγμα εντολής (Pseudo-JSON)

json
{
"command": "CapturePayment",
"payment_id": "pay_123",
"amount": 1000,
"currency": "EUR",
"idempotency_key": "k-789",
"trace_id": "t-abc"
}

Σχεδιασμός μοντέλου ανάγνωσης

Έναρξη ερωτήσεων: ποιες οθόνες/εκθέσεις χρειάζονται

Η απομαλοποίηση είναι αποδεκτή: μοντέλο ανάγνωσης - «βελτιστοποιημένη κρύπτη».
Διάφορες προβολές για διάφορες εργασίες: αναζήτηση (OpenSearch), αναφορές (αποθήκευση στήλης), κάρτες (KV/Redis).
TTL και επανασυναρμολόγηση: οι προβολές πρέπει να μπορούν να ανακάμπτουν από την πηγή (επανάληψη γεγονότων/στιγμιότυπα).


Συνέπεια και UX

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


Πηγή CQRS και συμβάντων (προαιρετικό)

Η Sourcing (ES) αποθηκεύει εκδηλώσεις και η κατάσταση του συνόλου είναι το αποτέλεσμα της σύγκλισής τους.
Το πακέτο CQRS + ES δίνει ένα ιδανικό έλεγχο και εύκολη επανασυναρμολόγηση των προβλέψεων, αλλά αυξάνει την πολυπλοκότητα.
Εναλλακτική λύση: τακτική βάση δεδομένων OLTP + προβολές outbox/CDC →.


Αντιγραφή: Outbox και CDC

Outbox (σε μία συναλλαγή): αλλαγές τομέα εγγραφής + εγγραφή ενός γεγονότος σε outbox; ο εκδότης παραδίδει στο ελαστικό.
CDC: ανάγνωση από το ημερολόγιο της βάσης δεδομένων (Debezium κ.λπ.) → μετατροπή σε domain events.
Εγγυήσεις: εξ ορισμού τουλάχιστον μία φορά, οι καταναλωτές και οι προβλέψεις πρέπει να είναι ταυτόσημοι.


Επιλογή αποθήκευσης

Εγγραφή: σχεσιακή (PostgreSQL/MySQL) για συναλλαγές. KV/Έγγραφο - όπου οι αναλλοίωτες είναι απλές.

Ανάγνωση:
  • KV/Redis - κάρτες και γρήγορες αναγνώσεις κλειδιών;
  • Αναζήτηση (OpenSearch/Elasticsearch) - αναζήτηση/φίλτρα/όψεις;
  • Στήλη (ClickHouse/BigQuery) - εκθέσεις;
  • Cache on CDN - δημόσιοι κατάλογοι/περιεχόμενο.

Πρότυπα ολοκλήρωσης

Επίπεδο API: ξεχωριστά τελικά σημεία/υπηρεσίες για «εντολές» και «ερωτήματα».
Ιδιαιτερότητα: κλειδί της επιχείρησης στην κεφαλίδα/στο σώμα. αποθήκευση πρόσφατων κλειδιών με TTL.
Sagas/ενορχήστρωση: timeouts, αντισταθμίσεις, επαναληψιμότητα βήματος.
Η αντίθλιψη περιορίζει τον παραλληλισμό των επεξεργαστών προβολής.


Παρατηρησιμότητα

Γράψτε μετρήσεις: p95/99 λανθάνουσες εντολές, ποσοστό επιτυχών συναλλαγών, σφάλματα επικύρωσης.
Ανάγνωση μετρήσεων: p95/99 αιτήματα, κρύπτη hit-rate, φόρτωση στο σύμπλεγμα αναζήτησης.
Καθυστέρηση προβολής (χρόνος και μηνύματα), ρυθμός DLQ, ποσοστό αφαίρεσης.
Εντοπισμός: Το 'trace _ id' περνάει από την εντολή → outbox → την προβολή → ερωτημάτων.


Ασφάλεια και συμμόρφωση

Διαχωρισμός δικαιωμάτων: διαφορετικά πεδία/ρόλοι γραφής και ανάγνωσης· την αρχή του ελαχίστου προνομίου.
PII/PCI: ελαχιστοποίηση των προβολών· κρυπτογράφηση κατά την ανάπαυση/κατά την πτήση· μάσκες.
Έλεγχος: Διόρθωση ομάδας, παράγοντα, αποτέλεσμα, «trace _ id». Αρχεία WORM για κρίσιμους τομείς (πληρωμές, KYC).


Δοκιμές

Δοκιμές συμβάσεων: για εντολές (σφάλματα, αναλλοίωτες εντολές) και ερωτήματα (μορφές/φίλτρα).
Δοκιμές προβολής: υποβολή σειράς συμβάντων/CDC και έλεγχος του μοντέλου τελικής ανάγνωσης.
Χάος/καθυστέρηση: έγχυση καθυστέρησης στους επεξεργαστές προβολής. Έλεγχος UX σε καθυστέρηση.
Δυνατότητα αναπαραγωγής: επανασυναρμολόγηση προβολών στο περίπτερο από στιγμιότυπα/ημερολόγιο.


Μετανάστευση και εξέλιξη

Νέα πεδία - πρόσθετη ύλη σε περίπτωση/CDC τα μοντέλα ανάγνωσης ξαναχτίζονται.
Διπλή εγγραφή κατά τον επανασχεδιασμό των κυκλωμάτων. κρατούν παλιές προβολές μέχρι την αλλαγή.
Εκδοχή: 'v1 '/' v2' events and endpoints, Sunset-plan.
Σημαίες χαρακτηριστικών: εισαγωγή νέων ερωτημάτων/προβολών κατά μήκος του καναρινιού.


Αντι-μοτίβα

CQRS «για λόγους μόδας» σε απλές υπηρεσίες CRUD.
Σκληρή συγχρονισμένη εξάρτηση ανάγνωσης-εγγραφής (σκοτώνει την απομόνωση και την επιμονή).
Ένας δείκτης για όλους: ανάμειξη ετερογενών ερωτημάτων σε ένα αναγνωστήριο.
Οι προβολές δεν έχουν ιδιαιτερότητα → αντίγραφα και ασυμφωνίες.
Μη ανακτήσιμες προβλέψεις (καμία επανάληψη/στιγμιότυπα).


Παραδείγματα τομέων

Πληρωμές (επιγραμμική υπηρεσία)

Εγγραφή: 'Εξουσιοδότηση', 'Σύλληψη', 'Επιστροφή' σε βάση δεδομένων συναλλαγών. outbox δημοσιεύει την πληρωμή. '.

Ανάγνωση:
  • Redis «κάρτα πληρωμής» για τον UI·
  • ClickHouse για την υποβολή εκθέσεων·
  • Αναζήτηση OpenSearch για αναζήτηση συναλλαγών.
  • Κρίσιμη διαδρομή: έγκριση ≤ 800 ms p95. ανάγνωση συνέπειας για UI - ενδεχόμενη (έως 2-3 s).

KYC

Εγγραφή: εντολές για εκκίνηση/ενημέρωση κατάστασης; Αποθήκευση PII σε ασφαλή βάση δεδομένων.
Ανάγνωση: ελαφρά προβολή των καταστάσεων χωρίς PII. Το PII είναι σφιχτό σημείο εάν είναι απαραίτητο.
Ασφάλεια: διαφορετικά πεδία για την κατάσταση ανάγνωσης και την πρόσβαση σε έγγραφα.

Ισολογισμοί (iGaming/Finance)

Εγγραφή: Το σύνολο 'UserBalance' με ατομικές αυξήσεις/μειώσεις. idempotent κλειδιά για χειρουργική επέμβαση.
Ανάγνωση: κρύπτη για «γρήγορη ισορροπία», για διαγραφή - άμεση ανάγνωση από διαγραφή (αυστηρή συνέπεια).
Saga: οι καταθέσεις/τα συμπεράσματα συντονίζονται από γεγονότα, σε περίπτωση αποτυχίας - αποζημίωση.


Κατάλογος ελέγχου εφαρμογής

  • Τονίζονται τα συγκεντρωτικά μεγέθη και οι αναλλοίωτες του μοντέλου γραφής.
  • Καθορίζονται βασικά ερωτήματα και σχεδιάζονται προβλέψεις γι "αυτά.
  • Οι επεξεργαστές προβολής outbox/CDC και idempotent είναι ρυθμισμένοι.
  • Υπάρχει ένα στιγμιότυπο/σχέδιο επανάληψης.
  • SLO: καθυστέρηση εντολών, καθυστέρηση προβολής, ανάγνωση/εγγραφή διαθεσιμότητας ξεχωριστά.
  • Εφαρμογή χωριστών δικαιωμάτων πρόσβασης και κρυπτογράφησης δεδομένων.
  • Βλάβες συναγερμού DLQ/καθυστέρηση/αποπάγωση.
  • Δοκιμές: Συμβάσεις, προβλέψεις, χάος, επανάληψη.

ΣΥΧΝΈΣ ΕΡΩΤΉΣΕΙΣ

Είναι υποχρεωτική η προμήθεια συμβάντων για το CQRS

Όχι, δεν είναι. Μπορείτε να βασιστείτε σε μια κανονική βάση δεδομένων + outbox/CDC.

Πώς να αντιμετωπίσουμε την αποσυγχρονισμό

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

Είναι δυνατή η διατήρηση τόσο της γραφής όσο και της ανάγνωσης στην ίδια υπηρεσία

Ναι, ο φυσικός διαχωρισμός είναι προαιρετικός· ο λογικός καταμερισμός αρμοδιοτήτων είναι υποχρεωτικός.

Τι γίνεται με τις συναλλαγές μεταξύ συγκεντρωτικών μεγεθών

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


Αποτέλεσμα

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

Contact

Επικοινωνήστε μαζί μας

Επικοινωνήστε για οποιαδήποτε βοήθεια ή πληροφορία.Είμαστε πάντα στη διάθεσή σας.

Έναρξη ολοκλήρωσης

Το Email είναι υποχρεωτικό. Telegram ή WhatsApp — προαιρετικά.

Το όνομά σας προαιρετικό
Email προαιρετικό
Θέμα προαιρετικό
Μήνυμα προαιρετικό
Telegram προαιρετικό
@
Αν εισαγάγετε Telegram — θα απαντήσουμε και εκεί.
WhatsApp προαιρετικό
Μορφή: κωδικός χώρας + αριθμός (π.χ. +30XXXXXXXXX).

Πατώντας «Αποστολή» συμφωνείτε με την επεξεργασία δεδομένων.