Microservices & Event-Driven Architecture (EDA) Mastery

CQRS (Command Query Responsibility Segregation) with MediatR

1 Views Updated 5/4/2026

Mastering CQRS

Command Query Responsibility Segregation (CQRS) says that the model used for **Writing** data should be different from the model used for **Reading** data.

1. The "Write side" (Commands)

Optimized for business rules and consistency. This is where your DDD Aggregates live. It usually uses a relational database like SQL Server to ensure ACID compliance.

2. The "Read side" (Queries)

Optimized for the UI. No complex joins. No business logic. Often uses a NoSQL DB like **Elasticsearch** or **Redis** where the data is already pre-formatted for display. This makes 'Read' performance blazing fast, regardless of how complex the 'Write' logic is.

3. MediatR: The Glue

In .NET, we use the **MediatR** library to implement CQRS. It decouples your controllers from your business logic. The controller just sends a 'Command' or 'Query' to MediatR, and MediatR finds the one specific 'Handler' to process it. This leads to **Highly Testable** and **Thin Controllers**.

4. Interview Mastery

Q: "Do I ALWAYS need separate databases for CQRS?"

Architect Answer: "No. You can start with a single database and use CQRS to separate your **Code**. Use one model for updates and an 'AutoMapper' or 'Dapper' projection for reads. Only move to separate databases (and the resulting eventual consistency) when you've hit a performance bottleneck that can't be solved with indexing."

Microservices & Event-Driven Architecture (EDA) Mastery
1. Foundations of Microservices
The Monolith to Microservices transition: When and why? Domain Driven Design (DDD): Bounded Contexts and Aggregates Database Per Service: Managing data consistency Service Discovery and Health Checks in .NET
2. Communication Patterns
Synchronous Communication: HTTP/gRPC and Service Mesh Asynchronous Communication: Message Brokers (RabbitMQ/Kafka) API Gateways: YARP (Yet Another Reverse Proxy) vs Ocelot Protobuf and Shared Contracts: Managing breaking changes
3. Event-Driven Architecture (EDA)
Introduction to EDA: Producers, Consumers, and Topics The Publisher/Subscriber Pattern in .NET Event Sourcing: Capturing every state change CQRS (Command Query Responsibility Segregation) with MediatR
4. Distributed Transactions & Resiliency
The Saga Pattern: Orchestration vs Choreography The Outbox Pattern: Ensuring reliable message delivery Idempotency: Preventing duplicate message processing Distributed Locking with Redis (Redlock)
5. Observability & Monitoring
Distributed Tracing with OpenTelemetry Centralized Logging: ELK Stack (Elasticsearch, Logstash, Kibana) Metrics and Dashboards: Prometheus and Grafana Correlation IDs: Tracking requests across services
6. Security & Identity
Centralized Authentication: IdentityServer4 & Duende Identity OAuth2 and OIDC Flow for Microservices API Key Management and Rate Limiting Mutual TLS (mTLS) for Internal Service-to-Service Security
7. Infrastructure & Deployment
Containerization: Production-grade Dockerfiles Kubernetes for .NET: Pods, Services, and Ingress Helm Charts: Managing complex deployments Blue-Green and Canary Deployments in K8s
8. FAANG Microservices Case Studies
Case Study: Designing a Global Notification Engine (Reliability at Scale) Case Study: Building a High-Performance Logging Pipeline (PB/Day)