Transactional Outbox Pattern: Eine Lösung für Transaktionssicherheit in Microservices

In der Welt der Softwareentwicklung begegnen wir häufig dem Dilemma, wie man zwei Vorgänge, die in unterschiedlichen Systemen ausgeführt werden, als eine gemeinsame Transaktion modellieren kann. Eine direkte gemeinsame Transaktion ist oft nicht möglich, und hier bietet das Transactional Outbox Pattern eine elegante Lösung.

Das Problem der Transaktionssicherheit

Stellen wir uns vor, wir haben einen Microservice, der Daten speichert und Events an andere Dienste senden soll. Das Risiko besteht darin, dass nach dem Speichern der Daten in der Datenbank und vor dem Versenden des Events das System abstürzen könnte. Dies führt dazu, dass das Event möglicherweise nie gesendet wird. Ändert man die Reihenfolge, besteht das Risiko, dass Events gesendet werden, ohne dass die Datenbankänderungen gespeichert wurden. Beide Szenarien sind nicht ideal und gefährden die Transaktionssicherheit.

Die Lösung: Transactional Outbox Pattern

Das Transactional Outbox Pattern bietet eine zuverlässige Lösung für dieses Problem. Anstatt Events direkt nach dem Speichern der Daten zu senden, fügen wir einen Zwischenschritt hinzu: eine Outbox-Tabelle in der Datenbank. Hier werden alle zu sendenden Events gespeichert. Ein Publisher im Microservice, der entweder durch Datenbank-Trigger oder zeitgesteuert aktiviert wird, lädt die Events aus der Outbox-Tabelle und sendet sie an den Message Broker. Nach erfolgreichem Versand werden die Events aus der Outbox-Tabelle gelöscht.

Zustellungssemantiken: At-Least-Once und At-Most-Once

  1. At-Least-Once Delivery: Dies stellt sicher, dass jedes Event mindestens einmal gesendet wird. Es kann jedoch vorkommen, dass ein Event mehrmals gesendet wird, beispielsweise wenn der Service ausfällt, bevor das Event aus der Datenbank gelöscht wird. In solchen Fällen ist es wichtig, dass das Empfängersystem idempotent implementiert ist, um die mehrfache Verarbeitung desselben Events zu verhindern.
  2. At-Most-Once Delivery: Diese Semantik wird verwendet, um sicherzustellen, dass Events höchstens einmal gesendet werden. Hier besteht das Risiko, dass ein Event verloren geht, wenn ein Fehler auftritt, nachdem das Event in der Datenbank gespeichert, aber noch nicht gesendet wurde. Diese Semantik ist nützlich, wenn die Vermeidung von Duplikaten wichtiger ist als die Garantie, dass jedes Event gesendet wird.

Fazit

Das Transactional Outbox Pattern ist eine effektive Methode, um die Herausforderungen der Transaktionssicherheit in verteilten Systemen zu bewältigen. Es ermöglicht eine zuverlässige Kommunikation zwischen verschiedenen Systemen und Ressourcen, ohne die Gefahr von Datenverlust oder Inkonsistenzen. Im nächsten Video werde ich zeigen, wie man dieses Muster mit Azure Functions implementiert, um serverlose Microservices zu erstellen.

Weitere Posts

Azure Cloud Migrationen mit Erfolg.

Standort

neocentric GmbH
Siersdorferstraße 6c
52457 Aldenhoven

Registergericht: Düren, HRB 9387

Geschäftsführer: Florian Lenz