Was ist das Besondere an Event Sourcing?
Bevor wir ins Detail gehen, schauen wir uns an, was Event Sourcing ist und warum es so viel Aufmerksamkeit erregt:
- 📜 Historische Aufzeichnung: Jede Änderung ist ein Ereignis, das in Reihenfolge gespeichert wird.
- 🔄 Zustandsrekonstruktion: Aktueller Zustand? Einfach die Ereignisse erneut abspielen.
- 🔍 Audit-Trail: Wer hat was und wann gemacht? Alles ist dokumentiert.
- 🚀 Skalierbarkeit: Ereignisse sind unveränderlich, was ihre Verteilung und Skalierung erleichtert.
Kombiniert man dies mit einer serverlosen Architektur, hat man eine perfekte Lösung für die Cloud.
AWS EventBridge: Dein serverloser Event-Bus
AWS EventBridge ist der coole Typ auf der serverlosen Party. Es ist ein serverloser Event-Bus, der es einfach macht, Anwendungen mit Daten aus eigenen Apps, integrierten SaaS-Apps und AWS-Diensten zu verbinden.
Deshalb ist es perfekt für unser Event-Sourcing-System:
- 🔌 Plug-and-Play: Einfache Integration mit anderen AWS-Diensten.
- 🎯 Ereignisfilterung: Leite Ereignisse ohne komplexe Logik an den richtigen Ort.
- 📊 Schema-Registry: Definiere und verwalte deine Ereignisstruktur.
- 🔒 Sicherheit: AWS-Sicherheit und Verschlüsselung sind standardmäßig enthalten.
Unser serverloses Event-Sourcing-System aufbauen
Packen wir es an und bauen dieses System! Wir erstellen ein einfaches E-Commerce-System, das Änderungen des Bestellstatus verfolgt.
Schritt 1: EventBridge einrichten
Zuerst müssen wir einen benutzerdefinierten Event-Bus erstellen. Das kannst du über die AWS-Konsole oder die AWS CLI tun:
aws events create-event-bus --name "OrderEventBus"
Schritt 2: Unser Ereignis-Schema definieren
Definieren wir ein Schema für unsere Bestellstatusänderungen:
{
"OrderId": "string",
"Status": "string",
"Timestamp": "string",
"Details": {
"CustomerId": "string",
"Amount": "number"
}
}
Du kannst dieses Schema in der EventBridge Schema Registry erstellen, um eine bessere Verwaltung und Auffindbarkeit zu gewährleisten.
Schritt 3: Ereignisse senden
Jetzt senden wir ein Ereignis, wenn sich der Bestellstatus ändert. So könnte es mit dem AWS SDK für JavaScript aussehen:
const AWS = require('aws-sdk');
const eventbridge = new AWS.EventBridge();
async function sendOrderStatusChangeEvent(orderId, status, customerId, amount) {
const params = {
Entries: [
{
Source: 'com.myecommerce.orders',
EventBusName: 'OrderEventBus',
DetailType: 'OrderStatusChange',
Time: new Date(),
Detail: JSON.stringify({
OrderId: orderId,
Status: status,
Timestamp: new Date().toISOString(),
Details: {
CustomerId: customerId,
Amount: amount
}
})
}
]
};
try {
const result = await eventbridge.putEvents(params).promise();
console.log('Ereignis erfolgreich gesendet:', result);
} catch (error) {
console.error('Fehler beim Senden des Ereignisses:', error);
}
}
// Verwendung
sendOrderStatusChangeEvent('ORD-123', 'VERSENDET', 'CUST-456', 99.99);
Schritt 4: Ereignisse verarbeiten
Um diese Ereignisse zu verarbeiten, verwenden wir AWS Lambda. Erstelle eine Lambda-Funktion und richte eine EventBridge-Regel ein, um sie auszulösen:
exports.handler = async (event) => {
console.log('Ereignis empfangen:', JSON.stringify(event, null, 2));
const orderEvent = event.detail;
// Hier könntest du:
// 1. Das Ereignis in einem dauerhaften Speicher (z.B. DynamoDB) speichern
// 2. Ein Lese-Modell für Abfragen aktualisieren
// 3. Andere Geschäftsprozesse auslösen
return {
statusCode: 200,
body: JSON.stringify('Ereignis erfolgreich verarbeitet'),
};
};
Schritt 5: Die EventBridge-Regel erstellen
Richte eine Regel ein, um Ereignisse an deine Lambda-Funktion zu leiten:
aws events put-rule \
--name "OrderStatusChangeRule" \
--event-bus-name "OrderEventBus" \
--event-pattern "{\"source\":[\"com.myecommerce.orders\"],\"detail-type\":[\"OrderStatusChange\"]}"
aws lambda add-permission \
--function-name YourLambdaFunctionName \
--statement-id EventBridgeInvoke \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:YOUR_REGION:YOUR_ACCOUNT_ID:rule/OrderEventBus/OrderStatusChangeRule
aws events put-targets \
--rule OrderStatusChangeRule \
--event-bus-name OrderEventBus \
--targets "Id"="1","Arn"="arn:aws:lambda:YOUR_REGION:YOUR_ACCOUNT_ID:function:YourLambdaFunctionName"
Das Gute, das Schlechte und das Ereignisreiche
Jetzt, da wir unser serverloses Event-Sourcing-System aufgebaut haben, sprechen wir über die Vor- und Nachteile:
Vorteile:
- 🚀 Skalierbarkeit: EventBridge skaliert automatisch mit deinem Ereignisvolumen.
- 💸 Kosteneffizienz: Bezahle nur für die Ereignisse, die du verarbeitest.
- 🔗 Lose Kopplung: Neue Verbraucher können einfach hinzugefügt werden, ohne die Produzenten zu beeinflussen.
- 🕰️ Time-Travel-Debugging: Spiele Ereignisse erneut ab, um jeden vergangenen Zustand wiederherzustellen.
Nachteile:
- 🧠 Mentale Umstellung: Ereignisgesteuertes Denken kann anfangs herausfordernd sein.
- 🐢 Eventuelle Konsistenz: Echtzeitabfragen können schwierig sein.
- 🗃️ Ereignisspeicherung: Du benötigst eine Strategie für die langfristige Speicherung und Verwaltung von Ereignissen.
Fazit: Warum serverlos mit Event Sourcing?
Serverloses Event Sourcing mit AWS EventBridge ist nicht nur eine komplizierte Architektur. Es ist ein leistungsstarker Ansatz, der bieten kann:
- 📈 Verbesserte Skalierbarkeit: Bewältige Verkehrsspitzen ohne Probleme.
- 💡 Bessere Einblicke: Erfasse jede Änderung für erweiterte Analysen und Debugging.
- 🛠️ Flexibilität: Passe dein System leicht an, wenn sich Geschäftsanforderungen ändern.
Denke daran, wie jede architektonische Entscheidung ist es keine Einheitslösung. Aber für Systeme, die Zustandsänderungen genau verfolgen müssen, besonders in einer verteilten Umgebung, kann dieser Ansatz ein Game-Changer sein.
"Der beste Weg, die Zukunft vorherzusagen, ist, sie zu implementieren." - Alan Kay
Bist du bereit, deine Zukunft mit serverlosem Event Sourcing zu implementieren? Probiere es aus, und du wirst dich vielleicht fragen, wie du jemals ohne es ausgekommen bist. Viel Spaß beim Programmieren, und mögen deine Ereignisse immer ihren Weg finden! 🚀
Weiterführende Lektüre und Ressourcen
- AWS EventBridge Dokumentation
- Martin Fowler über Event Sourcing
- AWS Serverless Event Fork Pipeline (Beispiel)
Denke daran, der Weg zur Beherrschung von serverlosem Event Sourcing ist ein Marathon, kein Sprint. Experimentiere weiter, lerne weiter und vor allem, lass die Ereignisse fließen! 🌊