A working example of an Order Processing Saga using:
- MassTransit
- RabbitMQ
- Entity Framework Core
- PostgreSQL (with EF Core Migrations)
- Outbox Pattern
- Saga State Machine for managing the order lifecycle
- Event-driven messaging with RabbitMQ
- Outbox Pattern for reliable message delivery
- Entity Framework Core repository for saga persistence
- Example consumers for handling stock and payment events
- PostgreSQL schema & migration scripts included
- src/
- βββ Consumers/ # Event consumers
- βββ Messages/ # Message contracts
- βββ Sagas/ # State machine & state model
- βββ Program.cs # Application entry point
- βββ OrdersSagaDbContext.cs
- βββ ...
π Requirements
- .NET 9 SDK
- PostgreSQL
- RabbitMQ
- Docker (optional, for local RabbitMQ & PostgreSQL)
git clone https://github.com/<your-username>/mass-transit-order-saga.git
cd mass-transit-order-saga
##2οΈβ£ Set up PostgreSQL & RabbitMQ (via Docker)
docker-compose up -d
(docker-compose.yml is included in this repo)
3οΈβ£ Apply EF Core migrations
dotnet ef database update
##4οΈβ£ Run the app
dotnet run
π Workflow
OrderSubmitted event starts the saga. Saga requests stock reservation. If stock is available, saga requests payment authorization. Once payment is authorized, saga completes the order. Saga is marked as completed and archived.
π§ͺ Testing You can send events using any message publisher (MassTransit client, Postman with RabbitMQ HTTP API, etc.).
Example payload for OrderSubmitted:
{
"OrderId": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"CustomerEmail": "[email protected]",
"Total": 99.99
}