Warum Event-Getriebene Architektur?
EDA ermöglicht lose Kopplung, zeitliche Entkopplung und Protokolle durch Voreinstellung. Es führt jedoch auch Komplexität bei der Reihenfolge, Konsistenz und Fehlerbehandlung ein.
Kernmuster
1. Ereignisbenachrichtigung
Das einfachste Muster: Emittieren Sie ein Ereignis, wenn etwas passiert, lassen Sie andere Dienste reagieren.
await eventBus.emit("order.created", {
orderId: order.id,
customerId: order.customerId,
items: order.items,
total: order.total
});2. Ereignisquelle
Speichern Sie jeden Zustandswechsel als unveränderliches Ereignis. Der aktuelle Zustand wird durch Wiederspielung von Ereignissen abgeleitet.
const events = [
{ type: "OrderCreated", data: { items: [...] }, timestamp: "2025-01-15T10:00:00Z" },
{ type: "PaymentReceived", data: { amount: 100 }, timestamp: "2025-01-15T10:05:00Z" },
{ type: "OrderShipped", data: { carrier: "FedEx", tracking: "123" }, timestamp: "2025-01-16T09:00:00Z" }
];3. CQRS (Befehls-Abfrage-Verantwortung-Segregation)
Trennen Sie die Lesemodelle und die Schreibmodelle für unterschiedliche Leistungsbereiche. Das Schreibmodell optimiert sich für Konsistenz, das Lesemodell optimiert sich für die Leistung bei Abfragen.
Broker-Wahl
| Broker | Best For | Trade-offs |
|---|---|---|
| RabbitMQ | Komplexes Routing, Zuverlässigkeit | Niedrigere Durchsatzleistung als Kafka |
| Kafka | Hohe Durchsatzleistung, Ereignisquelle | Erhöhte operative Komplexität |
| SQS/SNS | Einfache Warteschlange/Publik-Abonnement | AWS-Lock-in |
Fehlerbehandlung
- Tote Briefe für Nachrichten, die nicht verarbeitet werden können
- Idempotenzschlüssel für Duplikate
- Umleitungsbrücken für Ausfälle von Downstream-Diensten
- Saga-Muster für verteilte Transaktionen