Architecturing Architectures with NServiceBus

NServiceBus

NServiceBus

  • Lightweight framework for designing distributed systems in .NET
  • An Enterprise Service Bus
  • Helps to make distributed systems more:
    • Scalable
    • Reliable
    • Extensible
  • Services and support provided by Particular
  • Open Source but not free
  • Binaries available through Nuget

Website

OrderService

PlaceOrder(order)

Request Order

Response OrderId

Synchronous

The website is blocked while calling the Order Service

Remote Procedure Call

Website

Message Queue

Message: PlaceOrder

Asynchronous

The website is NOT blocked while the place order is processed

Message oriented architecture

Windows Service

Process the PlaceOrder message

Connect

Receive

PlaceOrder

Messages in NServiceBus

  • Just simple .NET classes with properties (POCO)
  • 2 Types of messages
    • Commands
      • Do Something: PlaceOrder
      • Sent from one (or more) senders, processed by one endpoint
      • Implement ICommand
    • Event
      • Something has happened: OrderWasPlaced
      • Published from one sender, processed by several endpoints/subscribers
      • Implement IEvent

Queue(eueueueu)s

  • FIFO datastructure for storing and retrieving messages
  • Default queue in NServiceBus is MSMQ
  • Support for
    • ActiveMQ
    • RabbitMQ
    • SQL Server
    • Windows Azure Queues
    • Windows Azure ServiceBus
  • One endpoint has one queue, send-only endpoints do not have queues

Using NServiceBus to integrate systems

CQRS

Command and Query Responsibility Segregation

CQS

"Command Query Separation" describes the principle that an object's methods should be either commands or queries. A query returns data and does not alter the state of the object; a command changes the state of an object but does not return any data. The benefit is that you have a better understanding what does, and what does not, change the state in your system.

CQRS

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. A command is any method that mutates state and a query is any method that returns a value.

-Greg Young, CQRS, Task Based UIs, Event Sourcing agh!

CustomerService

void MakeCustomerPreferred(CustomerId)
Customer GetCustomer(CustomerId)
CustomerSet GetCustomersWithName(Name)
CustomerSet GetPreferredCustomers()
void ChangeCustomerLocale(CustomerId, NewLocale)
void CreateCustomer(Customer)
void EditCustomerDetails(CustomerDetails)

 

CustomerWriteService

void MakeCustomerPreferred(CustomerId)
void ChangeCustomerLocale(CustomerId, NewLocale)
void CreateCustomer(Customer)
void EditCustomerDetails(CustomerDetails)

CustomerReadService

Customer GetCustomer(CustomerId)
CustomerSet GetCustomersWithName(Name)
CustomerSet GetPreferredCustomers()

CQRS

CQRS is a simple pattern that strictly segregates the responsibility of handling command input into an autonomous system from the responsibility of handling side-effect-free query/read access on the same system. Consequently, the decoupling allows for any number of homogeneous or heterogeneous query/read modules to be paired with a command processor.

 

In simple terms, you don't service queries via the same module of a service that you process commands through. In REST terminology, GET requests wire up to a different thing from what PUT, POST, and DELETE requests wire up to.
—Clemens Vasters (CQRS Advisors Mail List)

So... Simple! Right?

MS: A CQRS Journey

Event Sourcing

Still simple?

Eventual consistency

Aggregates and object-relational mapping layers

Aggregates and event sourcing

Commands and optimistic concurrency

Modelling intent

Concurrency and aggregates

idempotent messaging

Out-of-order messages

Event versioning

SAGA

Communicating Between Bounded Contexts

Anti-corruption layer

MicroServices

NServiceBus

By Tim Sommer