SlideShare una empresa de Scribd logo
1 de 41
A scalable pattern for building large multi-user system




Brian Ritchie                  Twitter: @brian_ritchie
Chief Architect                Email: brian.ritchie@gmail.com
PaySpan, Inc.                  Blog: http://weblog.asp.net/britchie
                               Web: http://www.dotnetpowered.com
Brian Ritchie
» Chief Architect at PaySpan, Inc.
» Nearly 20 years of development
  experience
» Developing on .NET since 1.0
  Beta 1
» Contributed to Mono and other
  open source projects
Agenda
» What is CQRS anyway?
» Why is it needed?
» How does CQRS work?
» When should I use CQRS?
» Review example implementation
» According to Wikipedia:
  "CQRS is simply the creation of two objects
  where there was previously only one. The
  separation occurs based upon whether the
  methods are a command or a query (the same
  definition that is used by Meyer in Command
  and Query Separation, a command is any
  method that mutates state and a query is any
  method that returns a value)."
Put another way…
  Command/Query Responsibility Segregation (CQRS) is the
  idea that you can use a different model to update
  information than the model you use to read information.

In this context,
» Commands = Writes
» Queries = Reads

Pioneered by Greg Young & Udi Dahan
Let’s take a step back. Why do we build applications like we do today?

                                           It started with a stack of paper…




                                 …that needed to be keyed
        …and along came              into the machine
         the CRUD app!
Being good developers, we didn’t stop there. We built various models to
      protect us from change at different layers of the application.




                                              Diagram © Martin Fowler
But this wasn’t scalable…so we add more layers.




Not only did we add layers, but also complexity.
» All of this to provide scalability & a consistent view
  of the data.

                 But did we succeed?
Back to our CRUD app…



                                                             ?
                          ?



   ?          ?
                                                             ?
                          ?




Where is the consistency? We have stale data all over the place!
To understand this better, let’s look at a basic multi-user system.




                    Retrieve data
                                            Retrieve data

User is looking at stale
          data                                               Modify data




            Stale data is inherent in a multi-user system.
     The machine is now the source of truth…not a piece of paper.
Which begs the question…

» Is the data the user is looking at right now stale?
» Since stale data always exists,    No, we need a different
  is all of this complexity really   approach.
  needed to scale?
                                     One that…
                                     » Offers extreme scalability
                                     » Inherently handle multiple
                                       users
                                     » Can grow to handle
                                       complex problems without
                                       growing development costs
Which brings us
back to CQRS…



           Command captures the
             intent of the user


                                                                          Scale out
                                                                          as many
                                                                          copies as
                                                                           needed



                                                                            Persistent View Model schema
           After database is                                                   matches UI view model
           updated, publish
         result to view model
                                                         Diagram from Rinat Abdullin
                                                         http://abdullin.com/cqrs
                                    A queue can be
                                  utilized to optimize
                                  write performance
Let’s break it down…
Common components of the CQRS pattern:
» Task-based UI
» Commands
» Domain Objects
» Events
» Persistent View Model


             Note: these are common components…not required components
Task-based UI
Task-based UI
Why rethink the User Interface?
» Grids don’t capture the user’s intent
Task-based UI
Rethinking the User Interface
» Adjust UI design to capture intent
   ˃ what did the user really mean?
   ˃ intent becomes a command

» Why is intent important?
   ˃ Last name changed because of misspelling
   ˃ Last name changed because of marriage
   ˃ Last name changed because of divorce

» User interface can affect your architecture
Task-based UI
» Validation
   ˃ increase likelihood of command succeeding
   ˃ validate client-side
   ˃ optimize validation using persistent view model

» What about user feedback?
   ˃ Polling: wait until read model is updated
   ˃ Use asynchronous messaging such as email
       “Your request is being processed. You will receive an email
       when it is completed”
   ˃ Just fake it!
       Scope the change to the current user. Update a local in-
       memory model
Commands
Commands
» Commands encapsulate the user’s intent but do
  not contain business logic, only enough data for
  the command
» What makes a good command?
   ˃A command is an action – starts with a verb
   ˃The kind you can reply with: “Thank you. Your confirmation
    email will arrive shortly”. Inherently asynchronous.
» Commands can be considered messages
   ˃Messaging provides an asynchronous delivery mechanism
    for the commands. As a message, it can be
    routed, queued, and transformed all independent of the
    sender & receiver
Commands & Domain Objects
» The domain model is utilized for processing
  commands; it is unnecessary for queries.
» Unlike entity objects you may be used
  to, aggregate roots in CQRS only have methods (no
  getters/setters)
  Aggregate Roots
  Some things belong together, like Apple Pie and Ice Cream, or Sonny and
  Cher. And so it is with Entities and Value Objects (VOs) – some of them
  belong together. Aggregates are groups of things that belong together. An
  Aggregate Root is the thing that holds them all together.
  Example: OrderLines have no reason to exist without their parent Order, nor can they belong to
  any other Order. In this case, Order and OrderLines would be an Aggregate, and the Order
  would be the Aggregate Root
Commands & Domain Objects
» Setters are an anti pattern in your domain. DDD is not about
  modeling data, or nouns. It is about modeling behaviors that
  are solving the domain problem, or verbs.
» The public interface of your domain should solely consist in
  public methods on your aggregate roots. The idea is that each
  method represents a use case.
» From a design perspective, it is also the only way to ensure
  your objects invariants. That way, your aggregates are always
  fully consistent – they valid state at all times.
» If DDD is about behavior, then getters also should be an anti
  pattern. And they are.

                         Julienn Letrouit http://julienletrouit.com/?p=22
Events
Events
» Events describe changes in the system state
» An Event Bus can be utilized to dispatch events to
  subscribers
» Events primary purpose update the read model
» Events can also provider integration with external systems
» CQRS can also be used in conjunction with Event Sourcing.
 Event Sourcing
 Captures all changes to an application state as a sequence of events. The
 current state is constructed by applying the events in the order they were
 recorded. Not only does it give us the current state, but we can also use the
 event log to reconstruct past states, and as a foundation to automatically adjust
 the state to cope with retroactive changes.
 Summarized from Martin Fowler – http://martinfowler.com/eaaDev/EventSourcing.html
Persistent View Model
Persistent View Model

» Reads are usually the most common activity –
  many times 80-90%. Why not optimize them?
» Read model is based on how the user wants to see
  the data.
» Read model can be denormalized
  RDBMS, document store, etc.
» Reads from the view model don’t need to be
  loaded into the domain model, they can be bond
  directly to the UI.
Persistent View Model


                      UI
                                 Query only…keep it simple



            Persistent View Model


           For each view in the UI,
       have a view/table in the database

SELECT * FROM ViewModelTable (WHERE ID = @ID)
Persistent View Model
              Data Duplicated, No Relationships, Data Pre-Calculated
Customer Service Rep view                              Supervisor view
          List of customers                            List of customers
ID        Name    Phone                 ID      Name     Phone Lifetime value




          Rep_Customers_Table                     Supervisor_Customers_Table
     ID          Name           Phone     ID      Name        Phone        Lifetime Value
First off, when should I avoid it?
» CQRS can be overkill for simple applications.
» Don’t use it in a non-collaborative domain or
  where you can horizontally add more database
  servers to support more users/requests/data at
  the same time you’re adding web servers – there
  is no real scalability problem – Udi Dahan
CQRS is a pattern that is usually leveraged for a portion of a
system.
» This builds on a concept from Domain Driven Design (DDD)
   known as a Bounded Context.
  Bounded Context
  A Bounded Context is an area of your application which has explicitly defined borders, has it’s own
  model, has it’s own Model, and maintains it’s own code. - Jak Charlton

  A Bounded Context can be considered as a miniature application, containing it’s own
  domain, code and persistence mechanisms. Within a Bounded Context, there should be logical
  consistency, each Bounded Context should be independent of any other Bounded Context. -
  ThinkDDD.org

» A typical application there are multiple bounded
  contexts, any of which can be implemented the way it
  makes sense.
Guidelines for using CQRS:
» Large, multi-user systems CQRS is designed to address
  concurrency issues.
» Scalability matters With CQRS you can achieve great read
  and write performance. The system intrinsically supports
  scaling out. By separating read & write operations, each
  can be optimized.
» Difficult business logic CQRS forces you to not mix domain
  logic and infrastructural operations.
» Large or Distributed teams you can split development tasks
  between different teams with defined interfaces.
Commands are simple object that contain all the data to perform the underlying action. They
                          also express intent by there name.
An Command Executors accepts commands of a certain type and performs a corresponding
 action. The action should not contain business logic and should directly use the domain.
All events that have occurred end up in the event store. It contains all the event that
represents the state changes in the system. These can be used to build up the current state by
  replaying them all. This store can also be used to fill up new or repair existing read model.




                      For the event store, NCQRS supports
                  MSSQL, MongoDB, RavenDB, SqlLite, and more…
NCQRS provides a base class for denormalizers that allows them
             to be subscribed to the event bus.
Command / Query Responsibility Segregation
                  A scalable pattern for building large multi-user system




Brian Ritchie                          Twitter : @brian_ritchie
Chief Architect                        Email: brian.ritchie@gmail.com
PaySpan, Inc.                          Blog: http://weblog.asp.net/britchie
                                       Web: http://www.dotnetpowered.com
Command / Query Responsibility Segregation
                  A scalable pattern for building large multi-user system




Brian Ritchie                          Twitter : @brian_ritchie
Chief Architect                        Email: brian.ritchie@gmail.com
PaySpan, Inc.                          Blog: http://weblog.asp.net/britchie
                                       Web: http://www.dotnetpowered.com

Más contenido relacionado

La actualidad más candente

CQRS and Event Sourcing in Action
CQRS and Event  Sourcing in ActionCQRS and Event  Sourcing in Action
CQRS and Event Sourcing in ActionKnoldus Inc.
 
Design patterns for microservice architecture
Design patterns for microservice architectureDesign patterns for microservice architecture
Design patterns for microservice architectureThe Software House
 
Event Driven Software Architecture Pattern
Event Driven Software Architecture PatternEvent Driven Software Architecture Pattern
Event Driven Software Architecture Patternjeetendra mandal
 
Event Driven Architecture
Event Driven ArchitectureEvent Driven Architecture
Event Driven ArchitectureStefan Norberg
 
Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)Tom Kocjan
 
Introduction to Axon FrameWork with CQRS pattern
Introduction to Axon FrameWork with CQRS patternIntroduction to Axon FrameWork with CQRS pattern
Introduction to Axon FrameWork with CQRS patternKnoldus Inc.
 
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Developing event-driven microservices with event sourcing and CQRS  (svcc, sv...Developing event-driven microservices with event sourcing and CQRS  (svcc, sv...
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...Chris Richardson
 
Monoliths and Microservices
Monoliths and Microservices Monoliths and Microservices
Monoliths and Microservices Bozhidar Bozhanov
 
Introduction To Microservices
Introduction To MicroservicesIntroduction To Microservices
Introduction To MicroservicesLalit Kale
 
Domain Driven Design(DDD) Presentation
Domain Driven Design(DDD) PresentationDomain Driven Design(DDD) Presentation
Domain Driven Design(DDD) PresentationOğuzhan Soykan
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven DesignNader Albert
 
Microservices with event source and CQRS
Microservices with event source and CQRSMicroservices with event source and CQRS
Microservices with event source and CQRSMd Ayub Ali Sarker
 
CQRS and Event Sourcing
CQRS and Event Sourcing CQRS and Event Sourcing
CQRS and Event Sourcing Inho Kang
 
Microservice Architecture Software Architecture Microservice Design Pattern
Microservice Architecture Software Architecture Microservice Design PatternMicroservice Architecture Software Architecture Microservice Design Pattern
Microservice Architecture Software Architecture Microservice Design Patternjeetendra mandal
 

La actualidad más candente (20)

Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
CQRS and Event Sourcing in Action
CQRS and Event  Sourcing in ActionCQRS and Event  Sourcing in Action
CQRS and Event Sourcing in Action
 
Design patterns for microservice architecture
Design patterns for microservice architectureDesign patterns for microservice architecture
Design patterns for microservice architecture
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Event Driven Software Architecture Pattern
Event Driven Software Architecture PatternEvent Driven Software Architecture Pattern
Event Driven Software Architecture Pattern
 
Event Driven Architecture
Event Driven ArchitectureEvent Driven Architecture
Event Driven Architecture
 
Domain Driven Design
Domain Driven Design Domain Driven Design
Domain Driven Design
 
Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)
 
Introduction to Axon FrameWork with CQRS pattern
Introduction to Axon FrameWork with CQRS patternIntroduction to Axon FrameWork with CQRS pattern
Introduction to Axon FrameWork with CQRS pattern
 
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Developing event-driven microservices with event sourcing and CQRS  (svcc, sv...Developing event-driven microservices with event sourcing and CQRS  (svcc, sv...
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Monoliths and Microservices
Monoliths and Microservices Monoliths and Microservices
Monoliths and Microservices
 
Api Gateway
Api GatewayApi Gateway
Api Gateway
 
Introduction To Microservices
Introduction To MicroservicesIntroduction To Microservices
Introduction To Microservices
 
Domain Driven Design(DDD) Presentation
Domain Driven Design(DDD) PresentationDomain Driven Design(DDD) Presentation
Domain Driven Design(DDD) Presentation
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Microservices with event source and CQRS
Microservices with event source and CQRSMicroservices with event source and CQRS
Microservices with event source and CQRS
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
CQRS and Event Sourcing
CQRS and Event Sourcing CQRS and Event Sourcing
CQRS and Event Sourcing
 
Microservice Architecture Software Architecture Microservice Design Pattern
Microservice Architecture Software Architecture Microservice Design PatternMicroservice Architecture Software Architecture Microservice Design Pattern
Microservice Architecture Software Architecture Microservice Design Pattern
 

Similar a CQRS: Command/Query Responsibility Segregation

Workshop - cqrs brief introduction
Workshop - cqrs brief introductionWorkshop - cqrs brief introduction
Workshop - cqrs brief introductionFrancesco Garavaglia
 
Software architecture patterns
Software architecture patternsSoftware architecture patterns
Software architecture patternsMd. Sadhan Sarker
 
Applicare patterns di sviluppo con Azure
Applicare patterns di sviluppo con AzureApplicare patterns di sviluppo con Azure
Applicare patterns di sviluppo con AzureMarco Parenzan
 
MVVM for Modern Applications
MVVM for Modern ApplicationsMVVM for Modern Applications
MVVM for Modern ApplicationsJeremy Likness
 
TU-Charts Project - First Spring
TU-Charts Project - First SpringTU-Charts Project - First Spring
TU-Charts Project - First SpringDidac Montero
 
Application architecture for cloud
Application architecture for cloudApplication architecture for cloud
Application architecture for cloudMarco Parenzan
 
Deconstructing Monoliths with Domain Driven Design
Deconstructing Monoliths with Domain Driven DesignDeconstructing Monoliths with Domain Driven Design
Deconstructing Monoliths with Domain Driven DesignVMware Tanzu
 
JavaScript for Enterprise Applications
JavaScript for Enterprise ApplicationsJavaScript for Enterprise Applications
JavaScript for Enterprise ApplicationsPiyush Katariya
 
Introduction to CQRS - command and query responsibility segregation
Introduction to CQRS - command and query responsibility segregationIntroduction to CQRS - command and query responsibility segregation
Introduction to CQRS - command and query responsibility segregationAndrew Siemer
 
Enterprise Software Development Patterns
Enterprise Software Development PatternsEnterprise Software Development Patterns
Enterprise Software Development PatternsJosh Lane
 
Cloud computing virtualization
Cloud computing virtualizationCloud computing virtualization
Cloud computing virtualizationVaibhav Khanna
 
Cqrs and Event Sourcing Intro For Developers
Cqrs and Event Sourcing Intro For DevelopersCqrs and Event Sourcing Intro For Developers
Cqrs and Event Sourcing Intro For Developerswojtek_s
 
Iot cloud service v2.0
Iot cloud service v2.0Iot cloud service v2.0
Iot cloud service v2.0Vinod Wilson
 
Integration Patterns and Anti-Patterns for Microservices Architectures
Integration Patterns and Anti-Patterns for Microservices ArchitecturesIntegration Patterns and Anti-Patterns for Microservices Architectures
Integration Patterns and Anti-Patterns for Microservices ArchitecturesApcera
 
Microservices Architecture - Cloud Native Apps
Microservices Architecture - Cloud Native AppsMicroservices Architecture - Cloud Native Apps
Microservices Architecture - Cloud Native AppsAraf Karsh Hamid
 

Similar a CQRS: Command/Query Responsibility Segregation (20)

Workshop - cqrs brief introduction
Workshop - cqrs brief introductionWorkshop - cqrs brief introduction
Workshop - cqrs brief introduction
 
Software architecture patterns
Software architecture patternsSoftware architecture patterns
Software architecture patterns
 
Applicare patterns di sviluppo con Azure
Applicare patterns di sviluppo con AzureApplicare patterns di sviluppo con Azure
Applicare patterns di sviluppo con Azure
 
MVVM for Modern Applications
MVVM for Modern ApplicationsMVVM for Modern Applications
MVVM for Modern Applications
 
TU-Charts Project - First Spring
TU-Charts Project - First SpringTU-Charts Project - First Spring
TU-Charts Project - First Spring
 
Application architecture for cloud
Application architecture for cloudApplication architecture for cloud
Application architecture for cloud
 
Deconstructing Monoliths with Domain Driven Design
Deconstructing Monoliths with Domain Driven DesignDeconstructing Monoliths with Domain Driven Design
Deconstructing Monoliths with Domain Driven Design
 
Intro to Databases
Intro to DatabasesIntro to Databases
Intro to Databases
 
JavaScript for Enterprise Applications
JavaScript for Enterprise ApplicationsJavaScript for Enterprise Applications
JavaScript for Enterprise Applications
 
First spring
First springFirst spring
First spring
 
Cloud Design Patterns
Cloud Design PatternsCloud Design Patterns
Cloud Design Patterns
 
Introduction to CQRS - command and query responsibility segregation
Introduction to CQRS - command and query responsibility segregationIntroduction to CQRS - command and query responsibility segregation
Introduction to CQRS - command and query responsibility segregation
 
Azure and cloud design patterns
Azure and cloud design patternsAzure and cloud design patterns
Azure and cloud design patterns
 
Enterprise Software Development Patterns
Enterprise Software Development PatternsEnterprise Software Development Patterns
Enterprise Software Development Patterns
 
Cloud computing virtualization
Cloud computing virtualizationCloud computing virtualization
Cloud computing virtualization
 
Cqrs and Event Sourcing Intro For Developers
Cqrs and Event Sourcing Intro For DevelopersCqrs and Event Sourcing Intro For Developers
Cqrs and Event Sourcing Intro For Developers
 
Iot cloud service v2.0
Iot cloud service v2.0Iot cloud service v2.0
Iot cloud service v2.0
 
Integration Patterns and Anti-Patterns for Microservices Architectures
Integration Patterns and Anti-Patterns for Microservices ArchitecturesIntegration Patterns and Anti-Patterns for Microservices Architectures
Integration Patterns and Anti-Patterns for Microservices Architectures
 
MVC
MVCMVC
MVC
 
Microservices Architecture - Cloud Native Apps
Microservices Architecture - Cloud Native AppsMicroservices Architecture - Cloud Native Apps
Microservices Architecture - Cloud Native Apps
 

Más de Brian Ritchie

Transforming your application with Elasticsearch
Transforming your application with ElasticsearchTransforming your application with Elasticsearch
Transforming your application with ElasticsearchBrian Ritchie
 
Building Event-Driven Systems with Apache Kafka
Building Event-Driven Systems with Apache KafkaBuilding Event-Driven Systems with Apache Kafka
Building Event-Driven Systems with Apache KafkaBrian Ritchie
 
From Dev to Ops:Delivering an API to Production with Splunk
From Dev to Ops:Delivering an API to Production with SplunkFrom Dev to Ops:Delivering an API to Production with Splunk
From Dev to Ops:Delivering an API to Production with SplunkBrian Ritchie
 
Extending the Enterprise with MEF
Extending the Enterprise with MEFExtending the Enterprise with MEF
Extending the Enterprise with MEFBrian Ritchie
 
IIS Always-On Services
IIS Always-On ServicesIIS Always-On Services
IIS Always-On ServicesBrian Ritchie
 
Document Databases & RavenDB
Document Databases & RavenDBDocument Databases & RavenDB
Document Databases & RavenDBBrian Ritchie
 

Más de Brian Ritchie (7)

Transforming your application with Elasticsearch
Transforming your application with ElasticsearchTransforming your application with Elasticsearch
Transforming your application with Elasticsearch
 
Building Event-Driven Systems with Apache Kafka
Building Event-Driven Systems with Apache KafkaBuilding Event-Driven Systems with Apache Kafka
Building Event-Driven Systems with Apache Kafka
 
From Dev to Ops:Delivering an API to Production with Splunk
From Dev to Ops:Delivering an API to Production with SplunkFrom Dev to Ops:Delivering an API to Production with Splunk
From Dev to Ops:Delivering an API to Production with Splunk
 
Extending the Enterprise with MEF
Extending the Enterprise with MEFExtending the Enterprise with MEF
Extending the Enterprise with MEF
 
IIS Always-On Services
IIS Always-On ServicesIIS Always-On Services
IIS Always-On Services
 
Scaling Out .NET
Scaling Out .NETScaling Out .NET
Scaling Out .NET
 
Document Databases & RavenDB
Document Databases & RavenDBDocument Databases & RavenDB
Document Databases & RavenDB
 

Último

Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 

Último (20)

Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 

CQRS: Command/Query Responsibility Segregation

  • 1. A scalable pattern for building large multi-user system Brian Ritchie Twitter: @brian_ritchie Chief Architect Email: brian.ritchie@gmail.com PaySpan, Inc. Blog: http://weblog.asp.net/britchie Web: http://www.dotnetpowered.com
  • 2. Brian Ritchie » Chief Architect at PaySpan, Inc. » Nearly 20 years of development experience » Developing on .NET since 1.0 Beta 1 » Contributed to Mono and other open source projects
  • 3. Agenda » What is CQRS anyway? » Why is it needed? » How does CQRS work? » When should I use CQRS? » Review example implementation
  • 4. » According to Wikipedia: "CQRS is simply the creation of two objects where there was previously only one. The separation occurs based upon whether the methods are a command or a query (the same definition that is used by Meyer in Command and Query Separation, a command is any method that mutates state and a query is any method that returns a value)."
  • 5.
  • 6. Put another way… Command/Query Responsibility Segregation (CQRS) is the idea that you can use a different model to update information than the model you use to read information. In this context, » Commands = Writes » Queries = Reads Pioneered by Greg Young & Udi Dahan
  • 7.
  • 8. Let’s take a step back. Why do we build applications like we do today? It started with a stack of paper… …that needed to be keyed …and along came into the machine the CRUD app!
  • 9. Being good developers, we didn’t stop there. We built various models to protect us from change at different layers of the application. Diagram © Martin Fowler
  • 10. But this wasn’t scalable…so we add more layers. Not only did we add layers, but also complexity.
  • 11. » All of this to provide scalability & a consistent view of the data. But did we succeed?
  • 12. Back to our CRUD app… ? ? ? ? ? ? Where is the consistency? We have stale data all over the place!
  • 13. To understand this better, let’s look at a basic multi-user system. Retrieve data Retrieve data User is looking at stale data Modify data Stale data is inherent in a multi-user system. The machine is now the source of truth…not a piece of paper.
  • 14. Which begs the question… » Is the data the user is looking at right now stale?
  • 15. » Since stale data always exists, No, we need a different is all of this complexity really approach. needed to scale? One that… » Offers extreme scalability » Inherently handle multiple users » Can grow to handle complex problems without growing development costs
  • 16. Which brings us back to CQRS… Command captures the intent of the user Scale out as many copies as needed Persistent View Model schema After database is matches UI view model updated, publish result to view model Diagram from Rinat Abdullin http://abdullin.com/cqrs A queue can be utilized to optimize write performance
  • 17. Let’s break it down… Common components of the CQRS pattern: » Task-based UI » Commands » Domain Objects » Events » Persistent View Model Note: these are common components…not required components
  • 19. Task-based UI Why rethink the User Interface? » Grids don’t capture the user’s intent
  • 20. Task-based UI Rethinking the User Interface » Adjust UI design to capture intent ˃ what did the user really mean? ˃ intent becomes a command » Why is intent important? ˃ Last name changed because of misspelling ˃ Last name changed because of marriage ˃ Last name changed because of divorce » User interface can affect your architecture
  • 21. Task-based UI » Validation ˃ increase likelihood of command succeeding ˃ validate client-side ˃ optimize validation using persistent view model » What about user feedback? ˃ Polling: wait until read model is updated ˃ Use asynchronous messaging such as email “Your request is being processed. You will receive an email when it is completed” ˃ Just fake it! Scope the change to the current user. Update a local in- memory model
  • 23. Commands » Commands encapsulate the user’s intent but do not contain business logic, only enough data for the command » What makes a good command? ˃A command is an action – starts with a verb ˃The kind you can reply with: “Thank you. Your confirmation email will arrive shortly”. Inherently asynchronous. » Commands can be considered messages ˃Messaging provides an asynchronous delivery mechanism for the commands. As a message, it can be routed, queued, and transformed all independent of the sender & receiver
  • 24. Commands & Domain Objects » The domain model is utilized for processing commands; it is unnecessary for queries. » Unlike entity objects you may be used to, aggregate roots in CQRS only have methods (no getters/setters) Aggregate Roots Some things belong together, like Apple Pie and Ice Cream, or Sonny and Cher. And so it is with Entities and Value Objects (VOs) – some of them belong together. Aggregates are groups of things that belong together. An Aggregate Root is the thing that holds them all together. Example: OrderLines have no reason to exist without their parent Order, nor can they belong to any other Order. In this case, Order and OrderLines would be an Aggregate, and the Order would be the Aggregate Root
  • 25. Commands & Domain Objects » Setters are an anti pattern in your domain. DDD is not about modeling data, or nouns. It is about modeling behaviors that are solving the domain problem, or verbs. » The public interface of your domain should solely consist in public methods on your aggregate roots. The idea is that each method represents a use case. » From a design perspective, it is also the only way to ensure your objects invariants. That way, your aggregates are always fully consistent – they valid state at all times. » If DDD is about behavior, then getters also should be an anti pattern. And they are. Julienn Letrouit http://julienletrouit.com/?p=22
  • 27. Events » Events describe changes in the system state » An Event Bus can be utilized to dispatch events to subscribers » Events primary purpose update the read model » Events can also provider integration with external systems » CQRS can also be used in conjunction with Event Sourcing. Event Sourcing Captures all changes to an application state as a sequence of events. The current state is constructed by applying the events in the order they were recorded. Not only does it give us the current state, but we can also use the event log to reconstruct past states, and as a foundation to automatically adjust the state to cope with retroactive changes. Summarized from Martin Fowler – http://martinfowler.com/eaaDev/EventSourcing.html
  • 29. Persistent View Model » Reads are usually the most common activity – many times 80-90%. Why not optimize them? » Read model is based on how the user wants to see the data. » Read model can be denormalized RDBMS, document store, etc. » Reads from the view model don’t need to be loaded into the domain model, they can be bond directly to the UI.
  • 30. Persistent View Model UI Query only…keep it simple Persistent View Model For each view in the UI, have a view/table in the database SELECT * FROM ViewModelTable (WHERE ID = @ID)
  • 31. Persistent View Model Data Duplicated, No Relationships, Data Pre-Calculated Customer Service Rep view Supervisor view List of customers List of customers ID Name Phone ID Name Phone Lifetime value Rep_Customers_Table Supervisor_Customers_Table ID Name Phone ID Name Phone Lifetime Value
  • 32. First off, when should I avoid it? » CQRS can be overkill for simple applications. » Don’t use it in a non-collaborative domain or where you can horizontally add more database servers to support more users/requests/data at the same time you’re adding web servers – there is no real scalability problem – Udi Dahan
  • 33. CQRS is a pattern that is usually leveraged for a portion of a system. » This builds on a concept from Domain Driven Design (DDD) known as a Bounded Context. Bounded Context A Bounded Context is an area of your application which has explicitly defined borders, has it’s own model, has it’s own Model, and maintains it’s own code. - Jak Charlton A Bounded Context can be considered as a miniature application, containing it’s own domain, code and persistence mechanisms. Within a Bounded Context, there should be logical consistency, each Bounded Context should be independent of any other Bounded Context. - ThinkDDD.org » A typical application there are multiple bounded contexts, any of which can be implemented the way it makes sense.
  • 34. Guidelines for using CQRS: » Large, multi-user systems CQRS is designed to address concurrency issues. » Scalability matters With CQRS you can achieve great read and write performance. The system intrinsically supports scaling out. By separating read & write operations, each can be optimized. » Difficult business logic CQRS forces you to not mix domain logic and infrastructural operations. » Large or Distributed teams you can split development tasks between different teams with defined interfaces.
  • 35.
  • 36. Commands are simple object that contain all the data to perform the underlying action. They also express intent by there name.
  • 37. An Command Executors accepts commands of a certain type and performs a corresponding action. The action should not contain business logic and should directly use the domain.
  • 38. All events that have occurred end up in the event store. It contains all the event that represents the state changes in the system. These can be used to build up the current state by replaying them all. This store can also be used to fill up new or repair existing read model. For the event store, NCQRS supports MSSQL, MongoDB, RavenDB, SqlLite, and more…
  • 39. NCQRS provides a base class for denormalizers that allows them to be subscribed to the event bus.
  • 40. Command / Query Responsibility Segregation A scalable pattern for building large multi-user system Brian Ritchie Twitter : @brian_ritchie Chief Architect Email: brian.ritchie@gmail.com PaySpan, Inc. Blog: http://weblog.asp.net/britchie Web: http://www.dotnetpowered.com
  • 41. Command / Query Responsibility Segregation A scalable pattern for building large multi-user system Brian Ritchie Twitter : @brian_ritchie Chief Architect Email: brian.ritchie@gmail.com PaySpan, Inc. Blog: http://weblog.asp.net/britchie Web: http://www.dotnetpowered.com