Event-Driven Architecture

An Event-Driven Architecture Course Built on a Real System

Most event-driven architecture courses teach you a message broker and call it a day. Publishing to a topic is the easy 10%. The hard 90% is everything around it: reliable publishing, idempotent consumers, eventual consistency, and read models. My Modular Monolith Architecture course teaches all of it inside a running production-grade system.

What event-driven architecture actually requires

An event-driven system is not "we use RabbitMQ". It is a set of guarantees you have to engineer deliberately. What happens when the database transaction commits but the publish fails? That is the Outbox pattern. What happens when the same message arrives twice? That is the Inbox pattern and idempotent consumers.

Then come the design decisions. Should an event be a thin notification that forces consumers to call back for data, or should it carry the state with it (event-carried state transfer)? How do you build fast read models withmaterialized views and CQRS? How do you coordinate a business process that spans multiple modules without distributed transactions? That issaga orchestration.

Broker tutorials skip these questions because they only exist in a real system with real transactions and real failure modes. Which is exactly why this course teaches EDA inside one.

Where EDA lives in the course

Event-driven architecture is the backbone of the second half ofModular Monolith Architecture, built into Evently, the event ticketing platform we create from scratch:

  • Chapter 4: Module Communication (1h 22m). The synchronous vs asynchronous decision, and how events decouple modules from each other.
  • Chapter 7: Reliable Messaging (1h 10m). The Outbox and Inbox patterns, temporal decoupling, and idempotent consumers.
  • Chapter 8: Event-Driven Architecture (1h). Event notifications, event-carried state transfer, materialized views with CQRS, and saga orchestration.
  • Chapter 10: Extracting Modules (1h 24m). Events move onto RabbitMQ when a module becomes a microservice, with OpenTelemetry tracing across the boundary.
Saga flow for an order where inventory is reserved and payment processed, confirming the order on success or running compensating refund and inventory release steps when payment fails
A saga in one glance: the happy path, and the compensating steps when payment fails.

Chapter 9 backs it up with a testing strategy that covers event-driven flows, so eventual consistency does not mean "eventually we find out in production". If you are weighing broker options, I compared them in RabbitMQ vs. Kafka for .NET, and I walk through sagas in the saga pattern in .NET.

The safest place to learn EDA

I will be straight with you: you learn EDA in this course inside a modular monolith first, and RabbitMQ only appears when a module becomes a separate service. That is not a limitation. It is the most reliable way I know to learn event-driven systems.

Every hard EDA problem exists in-process: atomic publishing, duplicate delivery, ordering, eventual consistency between modules. Learning them there means your mistakes cost a refactor, not a 2 AM incident spanning five services. And when the events do move onto a broker in chapter 10, you watch the same patterns carry over almost unchanged. That is the proof they were right to begin with.

Flow diagram of an order placement inside a modular monolith where the handler saves the order and an outbox message, a background processor publishes an OrderPlacedIntegrationEvent, and the Shipping and Notification modules consume it
Real event-driven architecture, entirely inside a monolith: outbox, publisher, and two consuming modules.

Learn event-driven architecture the production way

Modular Monolith Architecture is 10 chapters and 12+ hours of video, updated to .NET 10, with the full source code of the Evently system: dozens of API endpoints, 50+ use cases, and 6000+ lines of code, with every event-driven decision made on camera. One-time payment, lifetime access, free preview lessons. 2,800+ engineers have taken it.

3D box mockup of the Modular Monolith Architecture digital course by Milan Jovanovic, showing a cube assembled from smaller modular blocks

Frequently asked questions

Is this a standalone event-driven architecture course?

No, and that is deliberate. Event-driven architecture is a core thread running through my Modular Monolith Architecture course, taught inside a real system instead of isolated broker demos. Chapters 4, 7, 8, and 10 cover module communication, Outbox and Inbox, the main event-driven patterns, and RabbitMQ messaging between services.

Which event-driven patterns does the course cover?

Domain and integration events, the Outbox pattern for atomic publishing, the Inbox pattern with idempotent consumers, event notifications, event-carried state transfer, materialized views with CQRS, and saga orchestration for multi-step business processes.

Do I need RabbitMQ or Kafka experience?

No. The event-driven patterns are introduced in-process first, where you can focus on the concepts without broker mechanics. RabbitMQ enters in chapter 10, when a module becomes a separate service and messages start crossing the network. Docker runs it, so setup is one command.

Why learn event-driven architecture in a modular monolith?

Because it is the safest place to learn it. Every hard part of EDA (reliable publishing, idempotency, eventual consistency, message ordering) exists inside a modular monolith, but a mistake costs you a refactor instead of a production incident across services. Once the patterns hold up in-process, moving them onto a broker is a small step. The patterns transfer; the blast radius does not.

Does the course cover the saga pattern?

Yes. Chapter 8 implements saga orchestration for a multi-step business process in the Evently system, alongside materialized views and CQRS. You see the saga coordinate work across module boundaries without a distributed transaction.

What do I need to know before starting?

At least 1 year of ASP.NET Core experience, ideally with Entity Framework Core. No prior messaging or event-driven experience is required. Familiarity with Docker helps, since PostgreSQL, RabbitMQ, and Redis run in containers.