Self Contained System - Proof of Concept

  • Tactical Domain Driven Design Patterns (Aggregate Root, Entities, Value Objects, Domain Events, Repository)
  • Unit Of Work Pattern & Optimistic Concurrency
  • Messaging via NServiceBus
  • Outbox Pattern (NServiceBusOutbox & HangfireOutbox)
  • Integration Tests

Use Cases

UC1: Add TodoItem

Database modification and message publish should happen transactionally. Therefore an Outbox is implemented.

Use-Case: Add TodoItem

UC2: Complete TodoItem

The second transaction requires an outbox implementation which is connected to the subscribing message for deduplication.

Use-Case: Complete TodoItem

UC3: Remove Deleted TodoItems

Simmilar to UC1 but this time we are not in a htttp context.

Use-Case: Delete removed TodoItems

TODO

  • SendLocal prüfen
  • Sagas prüfen
  • Dapper sql command + transaction
  • AggregateConcurrency Exception in einem MediatR Behavior handeln und Polly-Retries auslösen

Tests ausführen

  1. docker-compose up
  2. Tests mit Visual Studio ausführen

Zuständigkeiten

  • Web bietet eine REST API an. Dieses Projekt publiziert Events (bzw. schreibt diese in die Outbox) und abonniert Events vom Bus um SingalR Notifizierungen auszulösen.
  • Worker ist ein Web API Projekt aber dient als Background Worker. Der Worker Service publiziert und abonniert Events. Zudem werden Hangfire Jobs (wie bspw. die Outbox) vom Worker abgearbeitet.

Outbox Problematik

NServiceBus bietet mit ihrer Outbox bereits eine Lösung für solche Konsiszentprobleme an. Das Problem ist jedoch, dass diese ausschliesslich im Zusammenhand mit einer Inbox funktioniert. Mit aktivieren der Outbox ist also nur die Konsistenz zwischen DB und NSB im Message Handler Kontext (Event -> DB -> Event) gelöst.

Hier einige links dazu:

Im Moment gibt es mehrere Lösungsansätze: