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

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! 🌊