Die Rückverfolgbarkeit der Ereignisse und CQRs eignen sich für komplexe Gesch?ftssysteme. 1. Ereignisverfolgbarkeit bietet vollst?ndige Prüfungs- und Zeitreisef?higkeiten, indem Ereignissequenzrekonstruktionsstatus sparen, jedoch die Komplexit?t der Abfrage erh?ht. 2. CQRS trennt Lese- und Schreibmodelle, um die Skalierbarkeit und Leistung zu verbessern, führt jedoch die endgültige Konsistenz ein. 3. In Java kann Axon Framework in Kombination mit Spring Boot unter Verwendung von @aggregate implementiert werden, um Befehle zu verarbeiten, @EventSourcingHandler -Updates Status und @EventHandler Builds Lesemodelle; V. 5. Achten Sie auf die Unver?nderlichkeit des Ereignisses, die Versionskontrolle, die endgültige Konsistenzverarbeitung und die Komplexit?t des Debuggens. Diese Architektur ist bei hohen Nachfragesystemen von gro?em Wert.
Event Sourcing und Befehlsabfrage Trennung von Verantwortlichkeiten (CQRs) sind zwei wichtige Modelle in modernen verteilten Systemen, die sich mit komplexer Gesch?ftslogik befassen und die Systemskalierbarkeit verbessern. Im Java -?kosystem k?nnen diese beiden Modi effizient implementiert werden. Das Folgende ist eine Analyse aus verschiedenen Aspekten von Konzepten, Anwendungsszenarien, Implementierungsmethoden und Vorsichtsma?nahmen.

Was sind Event Sourcing und CQRs?
1. Ereignisbeschaffung
In herk?mmlichen Systemen speichern wir normalerweise nur den aktuellen Status der Entit?t (wie die Benutzerbilanz von 100 Yuan). Die Kernidee der Ereignisverfolgung ist: Nicht direkt den Zustand zu retten, sondern die Abfolge der Ereignisse zu retten, die zu Zustands?nderungen führen .
Beispielsweise wird die Kontostand?nderung in einem Benutzerkonto nicht direkt mit dem Saldo -Feld aktualisiert, sondern Datens?tze:

-
MoneyDeposited(amount=50)
-
MoneyWithdrawn(amount=20)
Der Staat wird durch Wiederholung dieser Ereignisse rekonstruiert.
Vorteil:

- Komplettes Prüfprotokoll
- Einfach zu debuggen und zurückzuziehen
- Unterstützen Sie Zeitreisen (rekonstruiert jederzeit den Status)
Mangel:
- Die Abfrageleistung kann sinken (Wiederholungsereignis erforderlich)
- Komplexer Ereignisversionsverwaltung
- Hohe Schwelle für Anf?nger
2. CQRS (Befehlsabfrageverantwortung Segregation)
CQRS trennt die Les- und Schreibvorg?nge des Systems:
- Befehl : Daten ?ndern, Modell schreiben (Modell schreiben)
- Abfrage : Daten lesen, entsprechend dem Lesemodell (Modell lesen)
Dies ist nicht nur Hierarchie, sondern erm?glicht auch verschiedene Datenmodelle, Datenbanken und sogar Technologie -Stapel, um Lesen und Schreiben zu verarbeiten.
Typische Struktur:
Client → Befehl → Befehlshandler → Ereignisse → Event Store ↓ Ereignishandler → Modell aktualisieren (z. B. SQL, Elasticsearch) ↓ Client ← Abfrage ← Modell lesen
Vorteil:
- Modelle lesen und schreiben k?nnen unabh?ngig optimiert werden
- Einfach zu skalieren (z. B. mehr Lesen und weniger Szenarien k?nnen den Abfragedienst in einem Abfragedienst skalieren)
- Eine klarere Aufteilung der Verantwortlichkeiten
Mangel:
- Die Systemkomplexit?t nimmt zu
- Es gibt eine Verz?gerung zwischen Lesen und Schreiben (endgültige Konsistenz)
Wie kann ich es in Java implementieren? Verwenden von Axon Framework
Axon ist das beliebteste Framework in Java zur Implementierung von Event Sourcing und CQRs und integriert sich gut in den Frühling.
Abh?ngigkeiten hinzufügen (Maven)
<De vorangehen> <gruppe> org.axonframework </Groupid> <artifactid> Axon-Spring-Boot-Starter </artifactid> <version> 4.6.0 </Version> </abh?ngig>
Beispiel: Bankkontoübertragung
1. Definieren Sie Ereignisse
?ffentliche Klasse MoneyDepoStedEvent { Public Final String AccountID; ?ffentliche endgültige doppelte Menge; ?ffentliches Geldverlust (String AccountID, Doppelbetrag) { this.accountID = AccountID; this.amount = Menge; } } ?ffentliche Klasse MoneywithDrawnEvent { Public Final String AccountID; ?ffentliche endgültige doppelte Menge; ?ffentliches Geld mit this.accountID = AccountID; this.amount = Menge; } }
2. Aggregat - Schreiben Sie ein Modell
@Aggregat ?ffentliche Klasse BankAccount { @AggregateIdentifier private String AccountID; privates Doppelbilanz; public bankAccount () {} // von Axon verlangt // Befehlshandler @CommandHandler public bankAccount (createAccountCommand -Befehl) { // Ver?ffentlichung des Account Creation Event aggregatelifecycle.Apply (New AccountCreatedEvent (command.AccountID)); } @CommandHandler public void Handle (EinzahlungMoneyCommand -Befehl) { if (command.Amount <= 0) { Neue IllegalArgumentException werfen ("Menge muss positiv sein"); } Aggregatelifecycle.Apply (neuer GelddepositedEvent (command.accountid, command.amount)); } @CommandHandler public void Handle (resctridMoneyCommand -Befehl) { if (command.amount> balance) { Neue IllegalStateException ("Unsufficial Funds") werfen; } Aggregatelifecycle.Apply (neues GeldwithDrawnEvent (command.accountid, command.Amount)); } // Event Sourcing Handler - verwendet, um den Status @EventourcingHandler zu aktualisieren public void on (MoneyDepoStedEvent Ereignis) { this.balance = event.amount; } @EventsourcingHandler public void on (Geld mit Ereignis) { this.balance -= event.amount; } }
3. Ereignisverarbeitung (Modell Update Reading Modell)
@Komponente ?ffentliche Klasse AccountProjection { private endgültige Accountrepository Accountrepository; public AccountProjection (AccountRrepository Accountrepository) { this.accounTRepository = Accountrepository; } @EventHandler public void on (MoneyDepoStedEvent Ereignis) { AccountView -Konto = Accountrepository.findbyId (Event.AccountID) .Orelse (New AccountView (Event.AccountID, 0.0)); Account.Balance = Event.Amount; Accountrepository.save (Konto); } @EventHandler public void on (Geld mit Ereignis) { AccountView -Konto = Accountrepository.findbyId (Event.AccountID) .orelsethrow (); Account.Balance -= Ereignis.Amount; Accountrepository.save (Konto); } }
4. Lesen Sie die Modellentit?t (für Abfrage)
@Juristische Person ?ffentliche Klasse AccountView { @Ausweis private String -ID; privates Doppelbilanz; // Konstruktoren, Getters, Setters }
5. Abfragen Sie die Schnittstelle
@Restcontroller ?ffentliche Klasse AccountQueryController { @Autowired private Accountrepository Accountrepository; @Getmapping ("/concusses/{id}") public AccountView getAccount (@PathVariable String -ID) { return Accountrepository.findbyId (id) .orelse (null); } }
Wann kann Event -Sourcing CQRs verwendet werden?
- Die Gesch?ftslogik ist komplex und erfordert eine Prüfverfolgung (wie Finanzen, Auftragssystem)
- Lesen und Schreiben von Ladungen variieren stark und ben?tigen unabh?ngige Expansion
- Das System muss "rückg?ngig machen", "Wiederholungen" und "Zeitreisen" unterstützen
- In der Microservice -Architektur die Kommunikation zwischen Diensten durch Ereignis
?? Nicht empfohlen für die Verwendung mit einfachen Crud-Systemen, es wird überentwickelt.
Dinge zu beachten
- Ereignis unver?nderlich : Nach der Ver?ffentlichung kann es nicht ge?ndert werden, und es k?nnen nur Vergütungsereignisse hinzugefügt werden.
- Ereignisversionskontrolle : Wenn sich die Ereignisstruktur ?ndert, muss die Serialisierungskompatibilit?t oder Migration unterstützt werden.
- Modellkonsistenz lesen : CQRS ist die endgültige Konsistenz, und das Front-End muss sich mit der Situation befassen, in der "der Betrieb erfolgreich ist, die Abfrage jedoch nicht aktualisiert wird".
- Debugging -Schwierigkeitserh?hung : Tools sind erforderlich, um Event -Stream -Anzeigen, Wiederholungen usw. zu unterstützen.
Zusammenfassen
In Java k?nnen Event Sourcing und CQRs über das Axon -Framework leichter implementiert werden:
- Verwenden Sie
@Aggregate
, um Schreibmodelle zu verwalten - Aktualisieren Sie den Aggregationsstatus mit
@EventSourcingHandler
- Verwenden Sie
@EventHandler
, um ein Lesemodell zu erstellen - Vollst?ndige Trennung von Befehlen und Abfragen
Obwohl die Komplexit?t eingeführt wird, ist diese Architektur in Systemen sehr wertvoll, die eine hohe überwachbarkeit und Skalierbarkeit erfordern.
Grunds?tzlich alles ist der Schlüssel zu verstehen, dass "Zustand das Ergebnis von Ereignissen ist" und dass "Lesen und Schreiben unterschiedliche Wege aufnehmen k?nnen".
Das obige ist der detaillierte Inhalt vonEreignisbeschaffung und CQRS -Muster in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen





Setupamaven/GradleProjectWithjax-rsdependencies-?hnlich Jersey; 2. CreatearestresourcEUntationSuchas@pathand@Get; 3.ConfiguretheApplicationviaApplicationSubclitsorweb.xml;

Maven ist ein Standardwerkzeug für Java -Projektmanagement und -aufbau. Die Antwort liegt in der Tatsache, dass Pom.xml verwendet wird, um Projektstruktur, Abh?ngigkeitsmanagement, Konstruktionslebenszyklusautomation und Plug-in-Erweiterungen zu standardisieren. 1. Verwenden Sie POM.xml, um Gruppen, Artefaktid, Version und Abh?ngigkeiten zu definieren; 2. Master -Kernbefehle wie MVNClean, Compile, Test, Paket, Installation und Bereitstellen; Fn. V. 5.

Verwenden Sie zun?chst JavaScript, um die Einstellungen für Benutzersysteme und lokal gespeicherte Themeneinstellungen zu erhalten und das Seitenthema zu initialisieren. 1. Die HTML -Struktur enth?lt eine Schaltfl?che zum Ausl?sen von Themenwechsel. 2. CSS verwendet: root, um helle Themenvariablen zu definieren, .Dark-Mode-Klasse definiert dunkle Themenvariablen und wendet diese Variablen über var () an. 3.. JavaScript erkennt bevorzuge-farbige Scheme und liest LocalStorage, um das ursprüngliche Thema zu bestimmen. 4. Schalten Sie die Dark-Mode-Klasse im HTML-Element beim Klicken auf die Schaltfl?che und speichern Sie den aktuellen Status vor LocalStorage. 5. Alle Farb?nderungen werden mit einer übergangsanimation von 0,3 Sekunden begleitet, um den Benutzer zu verbessern

Ja, ein gemeinsames CSS-Dropdown-Menü kann mit reinem HTML und CSS ohne JavaScript implementiert werden. 1. Verwenden Sie verschachtelte UL und Li, um eine Menüstruktur zu erstellen. 2. Verwenden Sie die: Hover Pseudo-Klasse, um die Anzeige und das Verstecken von Pulldown-Inhalten zu steuern. 3.. Setzen Sie Position: Relativ für Eltern -Li, und das Untermenü wird unter Verwendung von Position positioniert: absolut; 4. Das untergeordnete Standards ist angezeigt: Keine, die angezeigt wird: Block, wenn sie schwebend sind; 5. Multi-Level-Pulldown kann durch Verschachtelung, kombiniert mit dem übergang und Fade-In-Animationen erzielt und an mobile Terminals mit Medienabfragen angepasst werden. Die gesamte L?sung ist einfach und erfordert keine JavaScript -Unterstützung, was für gro?e geeignet ist

Um Hash -Werte mit Java zu generieren, kann es über die MessagedIGest -Klasse implementiert werden. 1. Holen Sie sich eine Instanz des angegebenen Algorithmus wie MD5 oder SHA-256; 2. Rufen Sie die Methode .update () auf, um die zu verschlüsselnden Daten zu übergeben. 3. Nennen Sie die Methode .Digest (), um ein Hash -Byte -Array zu erhalten. 4. Umwandeln Sie das Byte -Array in eine hexadezimale Zeichenfolge zum Lesen; Lesen Sie für Eingaben wie gro?e Dateien in Stücken und rufen Sie .update () mehrmals auf. Es wird empfohlen, SHA-256 anstelle von MD5 oder SHA-1 zu verwenden, um die Sicherheit zu gew?hrleisten.

Verwenden Sie datetime.strptime (), um Datumszeichenfolgen in DateTime -Objekt umzuwandeln. 1. Grundnutzung: Analyse "2023-10-05" als DateTime-Objekt über "%y-%M-%d"; 2. unterstützt mehrere Formate wie "%M/%d/%y", um amerikanische Daten zu analysieren, "%d/%m/%y", um britische Daten zu analysieren ",%b%d,%y%i:%m%p", um die Zeit mit AM/PM zu analysieren; 3.. Verwenden Sie DateUtil.Parser.Parse (), um unbekannte Formate automatisch zu schlie?en; 4. Verwenden Sie .D

Die Datei "Settings.JSON" befindet sich auf dem Pfad auf Benutzerebene oder Arbeitsbereichsebene und wird verwendet, um die VSCODE-Einstellungen anzupassen. 1. Benutzer-Level-Pfad: Windows ist C: \ Benutzer \\ AppData \ Roaming \ Code \ User \ Settings.json, MacOS is /users//library/applicationsupport/code/user/settings.json, Linux is /home/.config/code/usser/setings.json; 2. Pfad auf Arbeitsbereichsebene: .VSCODE/Einstellungen im Projekt Root Directory

Durch die Installation des EMMET-Plug-Ins k?nnen Sie das intelligente automatische Schlie?en von Tags erreichen und die Abkürzungssyntax unterstützen. 2. Aktivieren Sie "auto_match_enabled": true, damit Sublime einfache Tags automatisch vervollst?ndigen kann. 3. Verwenden Sie Alt. (Gewinn) oder Strg -Verschiebung. (MAC) Verknüpfungsschlüssel zum manuellen Schlie?en des aktuellen Tags - Es wird empfohlen, Emmet im t?glichen Leben zu verwenden. Die beiden letztgenannten Methoden k?nnen kombiniert werden, was effizient und einfach eingestellt ist.
