GH GambleHub

Πηγή γεγονότων: βασικά στοιχεία

Τι είναι η προμήθεια γεγονότων

Το Event Sourcing (ES) είναι ένας τρόπος αποθήκευσης της κατάστασης των αντικειμένων τομέα όχι ως «τρέχουσα γραμμή», αλλά ως ένα αμετάβλητο αρχείο καταγραφής γεγονότων που περιγράφει όλα όσα συνέβησαν. Η τρέχουσα κατάσταση του συνόλου επιτυγχάνεται με την επανάληψη (επανάληψη) των γεγονότων του, και τυχόν αναγνωσμένες απόψεις κατασκευάζονται ως προβολές πάνω από αυτό το ημερολόγιο.

Βασικές επιπτώσεις:
  • Η ιστορία είναι η «κύρια πηγή της αλήθειας», η κατάσταση είναι η προβολή της ιστορίας.
  • Κάθε κράτος μπορεί να αναπαραχθεί, να ελεγχθεί και να εξηγηθεί (έλεγχος).
  • Η προσθήκη νέων απόψεων και αναλύσεων δεν απαιτεί τη μετανάστευση παλαιών «στιγμιότυπων» - αρκεί για να χαθούν γεγονότα.

Βασικοί όροι

Σύνολο - μονάδα πεδίου συνοχής με σαφείς αναλλοίωτες (εντολή, πληρωμή, ισοζύγιο εργασιών).
Γεγονός - ένα αμετάβλητο γεγονός που συνέβη στο παρελθόν ("πληρωμή. εξουσιοδοτημένη εντολή «,». αποστέλλονται ").
Το Event Store είναι ημερολόγιο μόνο προσαρτήματος που παρέχει τη σειρά των γεγονότων εντός της μονάδας.
Συγκεντρωτική έκδοση είναι ο αριθμός του τελευταίου εφαρμοζόμενου γεγονότος (για αισιόδοξο νόμισμα).
Στιγμιότυπο - μια περιοδική εντύπωση της κατάστασης για την επιτάχυνση της σύγκλισης.
Προβολή (μοντέλο ανάγνωσης) - υλοποιημένη προβολή για ανάγνωση/αναζήτηση/αναφορά (συχνά ασύγχρονη).

Πώς λειτουργεί (νήμα → γεγονότα → προβολές)

1. Ο πελάτης στέλνει μια εντολή ('CapturePayment', 'Place Order').
2. Το σύνολο επικυρώνει τις αναλλοίωτες ουσίες και, αν όλες είναι εντάξει, δημιουργεί γεγονότα.
3. Τα γεγονότα προστίθενται ατομικά στο Event Store με επαλήθευση έκδοσης (αισιόδοξο νόμισμα).
4. Οι επεξεργαστές προβολής εγγράφονται στη ροή γεγονότων και ενημερώνουν τα μοντέλα ανάγνωσης.
5. Όταν το σύνολο φορτώνεται για την ακόλουθη εντολή, η κατάσταση αποκαθίσταται στο στιγμιότυπο (αν υπάρχει) → το συμβάν μετά το στιγμιότυπο.

Σχεδιασμός εκδηλώσεων

Απαιτούμενα χαρακτηριστικά γνωρίσματα (πυρήνας)

json
{
"event_id": "uuid",
"event_type": "payment. authorized. v1",
"aggregate_type": "Payment",
"aggregate_id": "pay_123",
"aggregate_version": 5,
"occurred_at": "2025-10-31T10:42:03Z",
"payload": { "amount": 1000, "currency": "EUR", "method": "card" },
"meta": { "trace_id": "t-abc", "actor": "user_42" }
}
Συστάσεις:
  • Ονομασία: 'domain. δράση. v {major} '.
  • Προσθετικότητα: τα νέα πεδία είναι προαιρετικά, χωρίς να αλλάζουν την έννοια των παλαιών.
  • Μινιμαλισμός: μόνο γεγονότα, χωρίς επικάλυψη εύκολα ανακτήσιμων δεδομένων.

Συμβάσεις και συστήματα

Διόρθωση σχημάτων (Avro/JSON Schema/Protobuf) και έλεγχος συμβατότητας σε CI.
Για «σπάσιμο» αλλαγών - μια νέα σημαντική έκδοση του γεγονότος και παράλληλη δημοσίευση 'v1 '/' v2' για την περίοδο μετάβασης.

Ανταγωνιστική πρόσβαση: αισιόδοξο νόμισμα

Κανόνας: Νέα γεγονότα μπορούν να γραφτούν μόνο αν 'αναμενόμενη _ έκδοση = current_version'.

Ψευδοκώδικας:
pseudo load: snapshot(state, version), then apply events > version new_events = aggregate. handle(command)
append_to_store(aggregate_id, expected_version=current_version, events=new_events)
//if someone has already written an event between load and append, the operation is rejected -> retray with reload

Έτσι, εγγυώμαστε την ακεραιότητα των αναλλοίωτων χωρίς κατανεμημένες συναλλαγές.

Στιγμιότυπα (επιτάχυνση σύγκλισης)

Τραβήξτε ένα στιγμιότυπο κάθε N γεγονότα ή χρονοδιακόπτη.
'snapshot _ state', 'σύνολο _ i ,' έκδοση ',' δημιουργήθηκε _ a .
Ελέγξτε πάντα και καλύψτε τα γεγονότα μετά το στιγμιότυπο (μην εμπιστεύεστε μόνο το cast).
Αφαιρέστε στιγμιότυπα έτσι ώστε να μπορούν να αναδημιουργηθούν από το ημερολόγιο (μην αποθηκεύετε «μαγικά» πεδία).

Προβολές και CQRS

Η ES συνδυάζεται φυσικά με CQRS:
  • Μοντέλο εγγραφής = συγκεντρωτικά στοιχεία + Κατάστημα γεγονότων.
  • Διαβάστε μοντέλα = προβολές επικαιροποιημένες από γεγονότα (κάρτες Redis, OpenSearch for search, ClickHouse/OLAP for reporting).
  • Οι προβολές είναι ταυτόσημες: η επανεπεξεργασία του ίδιου «event _ id» δεν αλλάζει το αποτέλεσμα.

Εξέλιξη και συμβατότητα κυκλωμάτων

Πρώτη προσθήκη: προσθήκη πεδίων. δεν αλλάζουν τύποι/σημασιολογία.
Για πολύπλοκες αλλαγές, απελευθέρωση νέων τύπων γεγονότων και εγγραφή μεταναστών προβολής.
Διατήρηση διπλής καταχώρησης ('v1' + 'v2') για τη μεταβατική περίοδο και λήψη 'v1' όταν όλες οι προβολές είναι έτοιμες.

Ασφάλεια, PII και το «δικαίωμα στη λήθη»

Το ιστορικό περιέχει συχνά ευαίσθητα δεδομένα. Προσεγγίσεις:
  • Ελαχιστοποίηση της PII σε γεγονότα (αναγνωριστικά αντί δεδομένων, λεπτομέρειες σε προστατευόμενες πλευρές).
  • Κρυπτογράφηση: κρυπτογράφηση πεδίων και, όταν ζητείται η διαγραφή, καταστροφή του κλειδιού (το γεγονός παραμένει, αλλά τα δεδομένα δεν είναι διαθέσιμα).
  • Εκδηλώσεις αναθεώρησης: 'χρήστης. piiredacted. v1 "με την αντικατάσταση ευαίσθητων πεδίων στις προβολές (η ιστορία διατηρεί το γεγονός της επεξεργασίας).
  • Πολιτικές διατήρησης: για ορισμένους τομείς, ορισμένα γεγονότα μπορούν να αρχειοθετηθούν στην αποθήκευση WORM.

Απόδοση και κλίμακα

Κατάτμηση: η σειρά είναι σημαντική μέσα στο σύνολο - κατάτμηση από 'agregate _ id'.
Ψυχρή εκκίνηση: στιγμιότυπα + περιοδική «συμπαγής» σύγκλιση.
Προσάρτημα παρτίδας - ομαδικά γεγονότα σε μία συναλλαγή.
Αντίθλιψη και DLQ για επεξεργαστές προβολής. μέτρο υστέρησης (χρόνος και αριθμός μηνυμάτων).
Ευρετηρίαση αποθήκευσης γεγονότων: γρήγορη πρόσβαση με '(aggregate_type, aggregate_id)' και με το χρόνο.

Έλεγχος

Δοκιμές προδιαγραφών για συγκεντρωτικά στοιχεία - σενάριο «εντολών → αναμενόμενων γεγονότων».
Δοκιμές προβολής: Τροφοδότηση της ροής συμβάντων και έλεγχος της πραγματικής κατάστασης/δεικτών.
Δοκιμές αναπαραγωγιμότητας: ανακατασκευή των προβολών από το μηδέν στο περίπτερο - βεβαιωθείτε ότι το αποτέλεσμα ταιριάζει.
Χάος/λανθάνουσα κατάσταση: εγχύστε καθυστερήσεις και λήψη, ελέγξτε την ταυτότητα.

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

1) Πληρωμές

Γεγονότα: "πληρωμή. αρχικώς καταβληθείσα πληρωμή «,». εγκεκριμένη πληρωμή «,». capted ',' πληρωμή. επιστραφείσα ".
Αναλλοίωτες: δεν μπορείτε να «συλλάβετε» χωρίς «εξουσιοδοτημένη». τα ποσά δεν είναι αρνητικά· το νόμισμα είναι αμετάβλητο.
Προβολές: «κάρτα πληρωμής» (KV), αναζήτηση συναλλαγών (OpenSearch), αναφορά (OLAP).

2) Παραγγελίες (ηλεκτρονικό εμπόριο)

Γεγονότα: 'order. τοποθετείται ',' σειρά. καταβληθείσα «,» διαταγή. συσκευασμένα ',' order. αποστέλλεται ',' παραγγελία. παραδοθέν ".
Αναλλοίωτες: Μεταβάσεις κατάστασης χάρτη κατάστασης. είναι δυνατή η ακύρωση πριν από τη «μεταφορά».
Προβολές: κατάλογος παραγγελιών χρηστών, πίνακες SLA ανά κατάσταση.

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

Γεγονότα: "ισορροπία. κατατεθειμένο «,» υπόλοιπο. Χρεωστικός «,» ισορροπία. credited ',' balance. προσαρμοσμένο ".
Σκληρή αναλλοίωτη: η ισορροπία δεν εξαφανίζεται <0. οι εντολές είναι 'operation _ i .
Κρίσιμες λειτουργίες διαβάζονται απευθείας από το σύνολο (αυστηρή συνέπεια), UI - από την προβολή (ενδεχόμενη).

Τυπική δομή καταστήματος γεγονότων (παραλλαγή DB)

συμβάματα

'event _ id (PK)', 'συνολικά _ type', 'συνολικά _ i ,' έκδοση ',' συνέβη _ at ',' event _ type ',' payload ',' meta '

Δείκτης: '(aggregate_type, aggregate_id, έκδοση)'.

στιγμιότυπα

'σύνολο _ τύπος', 'σύνολο _ i ,' έκδοση ',' κατάσταση ',' δημιουργήθηκε _ a

Δείκτης: '(aggregate_type, aggregate_id)'.

consumers_offsets

'consumer _ i ,' event _ i /' position ',' updated _ at '(για προβολές και λιανικό εμπόριο).

Συχνές ερωτήσεις (συχνές ερωτήσεις)

Είναι υποχρεωτική η χρήση ES παντού

Όχι, δεν είναι. Η ES είναι χρήσιμη όταν ο έλεγχος, οι πολύπλοκες αναλλοίωτες, η αναπαραγωγιμότητα και οι διαφορετικές αναπαραστάσεις δεδομένων είναι σημαντικές. Για την απλή CRUD, αυτό είναι περιττό.

Τι γίνεται με τα «τρέχοντα» αιτήματα

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

Χρειάζομαι έναν μεσίτη Kafka/stream

Κατάστημα γεγονότων - πηγή αλήθειας; ο μεσίτης είναι κατάλληλος για τη διανομή γεγονότων σε προβολείς και εξωτερικά συστήματα.

Τι να κάνω με το «δικαίωμα στη λήθη»

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

Πώς μπορώ να μεταναστεύσω παλιά δεδομένα

Γράψτε ένα σενάριο για αναδρομική παραγωγή γεγονότων («re-highstory») ή ξεκινήστε με το «state-as-is» και δημοσιεύστε γεγονότα μόνο για νέες αλλαγές.

Αντιπατερίδια

Πηγή γεγονότων «εκτός συνήθειας»: περιπλέκει το σύστημα χωρίς όφελος τομέα.
Λιπαρά συμβάντα: φουσκωμένα ωφέλιμα φορτία με PII και διπλά - φρένα και θέματα συμμόρφωσης.
Έλλειψη αισιόδοξου νομίσματος: απώλεια αναλλοίωτων κατά τη διεξαγωγή αγώνων.
Μη αναπαραγώγιμες προβολές: καμία αναπαραγωγή/στιγμιότυπα → χειροκίνητες διορθώσεις.
Ακατέργαστα CDC ως domain events: διαρροή σχημάτων DB και σκληρή συνδεσιμότητα.
Ανάμειξη εσωτερικών εκδηλώσεων και εκδηλώσεων ολοκλήρωσης: δημοσίευση μιας σταθεροποιημένης «βιτρίνας» έξω.

Κατάλογος ελέγχου παραγωγής

  • Ορίζονται συγκεντρωτικά μεγέθη, αναλλοίωτα και γεγονότα (τίτλοι, εκδόσεις, σχήματα).
  • Το Event Store παρέχει παραγγελία εντός του συνολικού και αισιόδοξου νομίσματος.
  • Περιλαμβάνονται στιγμιότυπα και το σχέδιο ανοικοδόμησής τους.
  • Οι προβολές είναι ταυτόσημες, υπάρχουν DLQs και lag metrics.
  • Τα συστήματα επικυρώνονται στον ΚΚΠ, η πολιτική έκδοσης τεκμηριώνεται.
  • Το PII ελαχιστοποιείται, τα πεδία είναι κρυπτογραφημένα, υπάρχει μια στρατηγική «λησμονώντας».
  • Επανάληψη προβολής που ελέγχθηκε στον πάγκο· έχει σχέδιο αποκατάστασης καταστροφών.
  • Dashboards: ταχύτητα εφαρμογής, καθυστέρηση προβολής, σφάλματα εφαρμογής, αναλογία retrays.

Σύνολο

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

Contact

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

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

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

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

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

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