Command Query Responsibility Segregation (CQRS)

Context

You have applied the [[Microservices architecture pattern]] and the [[Database per service]] pattern. As a result, it is no longer straightforward to implement queries that join data from multiple services. Also, if you have applied the [[Event sourcing]] pattern then the data is no longer easily queried.

Solution

Define a view database, which is a read-only replica that is designed to support that query. The application keeps the replica up to data by subscribing to Domain eventsarrow-up-right published by the service that own the data.

Examples

Resulting context

This pattern has the following benefits:

  • Supports multiple denormalized views that are scalable and performant

  • Improved separation of concerns = simpler command and query models

  • Necessary in an event sourced architecture

This pattern has the following drawbacks:

  • Increased complexity

  • Potential code duplication

  • Replication lag/eventually consistent views

  • The [[Database per Service]] pattern creates the need for this pattern

  • The [[API Composition]] pattern is an alternative solution

  • The [Domain event] pattern generates the events

  • CQRS is often used with [[Event sourcing]]

See also

Last updated