SlideShare a Scribd company logo
Message Oriented Architecture
using NServiceBus
Lars-Erik Kindblad
Senior Consultant
Twitter: @kindblad
E-mail: le@kindblad.com
What is NServiceBus?
 Lightweight messaging framework for designing distributed systems in
.NET
 An Enterprise Service Bus
 Helps to make distributed systems more
 Reliable
 Scalable
 Extensible

 Founded in 2006 by UDI Dahan, an international renowned expert on
software architecture and design
 Services and support provided by Particular Software
 Open Source but not free
 Source code available at https://github.com/Particular/NServiceBus

 Binaries available as NuGet packages
 Remote Procedure Call (Request/Response)
Request: Order

Website

Response: Order ID

Order Service
PlaceOrder(order)

Synchronous – The website is blocked while calling the Order Service

 Messaged Oriented Architecture (One-way messaging)
Message: PlaceOrder

Website

Message Queue

Connect

Receive
PlaceOrder message

Windows Service
Process the PlaceOrder message
Asynchronous – The website is NOT blocked while the place order is processed
NServiceBus Terminology & Components
Sender
/Send-Only
Endpoint

Message,
Command
or Event
Message: PlaceOrder

Website

Message Queue

Connect

Receive
PlaceOrder message

Windows Service
Process the PlaceOrder message
Message Handler

Worker
Endpoint,
Host or
Receiver
Messages in NServiceBus
 Just simple .NET classes with properties

 2 types of messages
 Command
• 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
 Command
Strongly coupled to
the receiving
endpoint
Command: PlaceOrder

Website

Command: PlaceOrder

Message Queue

Endpoint

 Event (Publish/Subscribe)
Subscribing
Endpoint

Loosely coupled to
the receiving
endpoints
Event: OrderWasPlaced

Worker
NServiceBus will add 3
messages to the
queue, one for each
subscriber

Event: OrderWasPlaced

Message Queue

Subscribing
Endpoint

Subscribing
Endpoint
Queues
 First in-first out datastructure for storing and retrieving messages
PlaceOrder message 4
First-In
Queue
PlaceOrder message 3
PlaceOrder message 2
PlaceOrder message 1
First-Out

 Default queue in NServiceBus is Microsoft Message Queuing (MSMQ)
 Available on all Windows editions since NT 4 and Windows 95

 Also support for






ActiveMQ
RabbitMQ
SQL Server
Windows Azure Queues
Windows Azure ServiceBus

 One endpoint has one queue, Send-Only endspoints do not have queues
How to Send & Handle Messages
Command: PlaceOrder

Website

Send

Command: PlaceOrder

Message Queue

Endpoint

Handle
(Command or Event)
Summary
 Sender endpoint
 Sends a message
 Can be a website, desktop application or even a worker endpoint

 Command
 Message where we want to do something concrete
 ICommand interface

 Event
 Message where we notify about something that has happened
 IEvent interface

 Message handler
 Processes a given message
 IHandleMessages<Message> interface

 Worker endpoint
 Finds and executes the handler for the message
 Can be a Windows Service, console application, WCF, website
NServiceBus Requirements
 MSMQ (default) or any other supported queue






ActiveMQ
RabbitMQ
SQL Server
Windows Azure Queues
Windows Azure ServiceBus

 Distributed Transaction Cordinator (DTC)
 RavenDB (default) or a relational database
 Download the installer from NServiceBus from http://particular.net/ to
setup the required components
NuGet packages
 NServiceBus Interfaces
 Interfaces that we need to define messages

 NServiceBus
 Most of the code that drives NServiceBus except hosting
 Use for send-only endpoints

 NServiceBus Host
 Console application that can be installed as a Windows Service
 Used to process/handle messages

 NServiceBus Testing
 Framework for testing NServiceBus endpoints
The Case – The eBook Shop
1. Create the order in the
database
2. Auto-pay the order using a
previously stored credit
card
3. Send an order confirmation
by e-mail
4. Deliver the book to the
Windows Phone device
The Usual Way - Request/Response
Place order
1. Add order

Browser

OrderController
Confirmation page
with order ID

Database
2. Charge credit card

PaymentService
3. Send mail

SMTP-Server
4. Deliver ebook

DeviceService
Problem #1 – The order is lost during an error
Place order
1. Add order

Browser

OrderController

Database

Error page
Exception

2. Charge credit card

Error

PaymentService

3. Send mail

SMTP-Server
4. Deliver ebook

DeviceService

 Conseqence
 The database is rolled back
 User receives an error
 Order must be sent again
Problem #2 – Poor Transaction Management
Place order
1. Add order

Browser

OrderController

Database

Error page
2. Charge credit card

PaymentService
3. Send mail

SMTP-Server
Exception

4. Deliver ebook

Error

DeviceService

 Conseqence:
 The credit card is charged (no transaction support)
 A mail saying the order was successful was sent (no transaction support)
 The order do not exist in the database (supports transaction – rolled back)
 The user will receive an error
Let’s Fix This With NServiceBus
 Change to a message oriented architecture
Add PlaceOrder
message

Place order

Browser

Queue

OrderController
Confirmation page

Old

New
The Message Must Also Be Processed
MSMQ

1. Connect

2. Receive message PlaceOrder

Worker
(Windows Service)

PlaceOrder

3. PlaceOrder
Message Handler

4. Add order

Database
5. Charge credit card

PaymentService
6. Send mail

SMTP-Server
7. Deliver ebook

DeviceService
When an Error Occur

4. Rollback. Put the message
back on the queue
and retry

MSMQ

1. Connect

2. Receive message
PlaceOrder

Worker
(Windows Service)

PlaceOrder

3. PlaceOrder
Error
Message Handler
More about MSMQ
 Max 4MB message size
 Persists messages to files. Default location C:WINDOWSSystem32msmqstorage
 Guranteed once-and-only-once delivery
 The message will only be handled once

 Supports transactional queues and distributed transactions (using DTC)
 If an error occur both changes to the database and to the queue can be rolled back

 Supports store-and-forward
 MSMQ will store messages locally before forwarding it to the queue on another server
 MSMQ will confirm when the message has been written to the disk in the outgoing
queue, not when it has been delivered to the server
 Important feature for distributed systems with unrealiable networks
Server A

Sender

MSMQ
Outgoing
queue

Server B
Message

MSMQ
Input
queue

Worker
How NServiceBus Handles Failure
 Transaction management and rollback are automatically handled by
NServiceBus in message handlers
 When an error occur
1. The message is put back on the queue
2. Attempt to process the message 5 times, wait for 10 seconds
3. Attempt to process the message 5 times, wait for 20 seconds
4. Attempt to process the message 5 times, wait for 30 seconds
5. Attempt to process the message 5 times, send the message to an error queue
The time interval is configurable

 Messages can be moved back to the original queue for replay using
ReturnToSourceQueue.exe tool.
A challenge – The Order ID
Old

New

 The order ID has not been generated yet – it’s generated in the message
handler at the worker endpoint
Possible Solutions
 Change the UI to not show the order ID
 Use a GUID (Guid.NewGuid()) or find another way to generate the ID in the controller
instead of in the database
• message.OrderId = Guid.NewGuid();
Bus.Send(message);
ViewBag.OrderId = message.OrderId;
• 5773DD0E-0AB0-446B-8649-B2D43D7DA4AA is not a very user friendly ID

 Move OrderRepository.Add(order) to the Controller:
• var orderId = OrderRepository.Add(order);
Bus.Send(message);
• Less reliable and more error prone solution

 Use Send/Reply to simulate request/response
• The controller will wait for a PlaceOrderCompleted message that the PlaceOrder handler will send
• Too much overhead
• An Anti-pattern
We Still Have Poor Transaction Management
1. Add order

Handle PlaceOrder

Database
2. Charge credit card

PaymentService
3. Send mail

SMTP-Server
4. Deliver ebook
Exception

Error

DeviceService

 Conseqence:
 The credit card is charged (no transaction support)
 A mail saying the order was successful was sent (no transaction support)
 The order do not exist in the database (supports transaction – rolledback)
 The message is put back on the queue and will be retried = credit card will be charged
twice
Solution
 Split into man small messages - One message per transactional boundary
Place order

OrderController

Browser

1. Add PlaceOrder message
PlaceOrder message

2. Handle PlaceOrder

Add PayOrder message

If an error occur only
DeliverEbook is affected. The
message will be put back on the
queue and retried

SendMail message

4. Handle SendMail
DeliverEbook message

5. Handle DeliverEbook

PayOrder message

Queue

Add SendMail &
DeliverEbook message

3. Handle PayOrder
Code - The Messages
Code – Message Handlers #1
Code – Message Handlers #2
Yet another transactional issue
MSMQ

Processed
ok

Handle PayOrder message

Charge credit card

Request
Handle PayOrder

Request: Error

PaymentService

Payment OK

Network
error

External
Payment
Gateway

 The message will be put back on the queue and processed again
 Consequence: The credit card will be charged more than once
Solution
 Operations should be idempotent
 Idempotent operations can be run many times without changing the result

MSMQ

Handle PayOrder message
Charge credit card

Request
Handle PayOrder

Payment OK

PaymentService

Has the order
been paid?
Use OrderId

Database

Payment OK

External
Payment
Gateway

Has the
message
already been
processed?
Use order ID
or a GUID

Database
Another Challenge – Eventual Consistency

Users clicks on View
Order History

 The PlaceOrder message is processed async by another process
 If it has not gotten processed yet then the new order will not be in the list
 Solution
 Some UI trick?
 Move the OrderRepository.Add to the controller
 Make sure the messages are handled fast enough
• Define a SLA on the message to help monitoring
Publish/Subscribe
Place order

OrderController

Browser

1. Add PlaceOrder message
PlaceOrder command

2. Handle PlaceOrder

Add PayOrder command

With Publish/Subscribe the
Subscribers are loosely coupled
to the publisher
Subscribe to OrderWasPaid

4. Handle SendMail

Subscribes to OrderWasPaid

Queue

3. Handle PayOrder
Add OrderWasPaid event

OrderWasPaid

Subscribes to OrderWasPaid

4. Handle DeliverEbook

PayOrder command

OrderWasPaid

NServiceBus will add 2
messages to the
queue, one for each
subscriber
Summary
Request/Response

Command

Event

X

X

Automatically retries

X

X

Full transactional
support

X

X

Reliable
Consistency

X

Can return ID
generated by the
database to the
sender

X

Loosely coupled

X

 Reads is synchronous and should be request/response
 Using a queue for synchronous operations gives little value, only overhead

 Writes can be asynchronous one-way messaging or events
 There are no silver bullet – We are always trading one set of problems for
another set of problems
Scaling
 Scale up
 Easy to scale up if business processes are split into multiple messages
 Increase the number of threads in the config – NServiceBus will concurrently process
multiple messages

 Scale out
 Use the Distributor or the Master (Both a distributor and a worker)
Worker #1

Message

MSMQ

Distributor

Worker #2

Worker #3

 The distributor will forward the message to a worker that is ready to process the message
How the Distributor Works
1. Worker:
Send I’m ready
message

I’m ready message

Distributor:
Control Queue

I’m ready message

Distributor

Any messages in
the input queue?

PlaceOrder message

1. Website:
Send
PlaceOrder
message

Send PlaceOrder
message from input
queue

PlaceOrder message

Distributor
Input Queue

Yes

No

PlaceOrder message

Distributor

Find worker
through
message in
Storage
queue

Store I’m ready
message
Storage Queue
Other Features
 Sagas
 Long running workflow like processes
 State is shared between multiple message handlers

 Scheduling
 Send a message every x minute. A handler will handle the message

 Unobtrusive mode
 Use your own ICommand, IEvent etc. to reduce coupling to NServiceBus

 Supports
 Various dependency injection containers
 Logging frameworks
 Etc.

 ++
NServiceBus License & Pricing
 Open source
 Used to be free, but not anymore
 Indefinitely license with 1 year maintenance updates
• $500 USD per processing core
• $250 USD per sending core

 Monthly subscription
• $35 USD per processing core
• $17 USD per sending core

 Development and testing environments + disaster recovery and passive
backups are free
 Developers need a license (free) that must be renewed every 3rd month
through particular.net
Demo
About Capgemini
With more than 120,000 people in 40 countries, Capgemini is one
of the world's foremost providers of consulting, technology and
outsourcing services. The Group reported 2011 global revenues
of EUR 9.7 billion.
Together with its clients, Capgemini creates and delivers
business and technology solutions that fit their needs and drive
the results they want. A deeply multicultural organization,
Capgemini has developed its own way of working, the
Collaborative Business ExperienceTM, and draws on Rightshore ®,
its worldwide delivery model.
Rightshore® is a trademark belonging to Capgemini

www.capgemini.com

The information contained in this presentation is proprietary.
© 2012 Capgemini. All rights reserved.

More Related Content

What's hot (20)

PDF
CompTIA Network+ Objectives
sombat nirund
 
PPTX
Cloud Resource Management
NASIRSAYYED4
 
PPTX
Cryptocurrency
Saroj Bhandari
 
PPTX
Chapter 17 : static routing
teknetir
 
PPTX
OSI Model.pptx
milon24
 
PDF
Alphorm.com Formation CCNP ENCOR 350-401 (1of8) : Commutation
Alphorm
 
PPTX
Juniper
Kappa Data
 
PDF
Introduction to Software Defined Networking (SDN)
rjain51
 
PDF
Introduction to OpenFlow
Joel W. King
 
PPTX
Public cloud
Dr.Neeraj Kumar Pandey
 
PPT
Virtualization in cloud
Ashok Kumar
 
PPTX
MVA slides lesson 3
Fabio Almeida- Oficina Eletrônica
 
PPTX
Multi-Signature Crypto-Wallets: Nakov at Blockchain Berlin 2018
Svetlin Nakov
 
PPTX
Server virtualization
ofsorganizer
 
PPTX
OpenStack Quantum Intro (OS Meetup 3-26-12)
Dan Wendlandt
 
PDF
13 palo alto url web filtering concept
Mostafa El Lathy
 
PPTX
3.2.2 World Wide Web (WWW)
Fizaril Amzari Omar
 
PDF
E mail protocol - SMTP
Md Syed Ahamad
 
PDF
CCNAv5 - S2: Chapter5 Inter Vlan Routing
Vuz Dở Hơi
 
PPTX
Network switch
Tapan Khilar
 
CompTIA Network+ Objectives
sombat nirund
 
Cloud Resource Management
NASIRSAYYED4
 
Cryptocurrency
Saroj Bhandari
 
Chapter 17 : static routing
teknetir
 
OSI Model.pptx
milon24
 
Alphorm.com Formation CCNP ENCOR 350-401 (1of8) : Commutation
Alphorm
 
Juniper
Kappa Data
 
Introduction to Software Defined Networking (SDN)
rjain51
 
Introduction to OpenFlow
Joel W. King
 
Virtualization in cloud
Ashok Kumar
 
Multi-Signature Crypto-Wallets: Nakov at Blockchain Berlin 2018
Svetlin Nakov
 
Server virtualization
ofsorganizer
 
OpenStack Quantum Intro (OS Meetup 3-26-12)
Dan Wendlandt
 
13 palo alto url web filtering concept
Mostafa El Lathy
 
3.2.2 World Wide Web (WWW)
Fizaril Amzari Omar
 
E mail protocol - SMTP
Md Syed Ahamad
 
CCNAv5 - S2: Chapter5 Inter Vlan Routing
Vuz Dở Hơi
 
Network switch
Tapan Khilar
 

Similar to Message Oriented Architecture using NServiceBus (20)

PPTX
How to build more reliable, robust and scalable distributed systems
Lars-Erik Kindblad
 
PPTX
Making communication across boundaries simple with Azure Service Bus
Particular Software
 
PPT
24. Advanced Transaction Processing in DBMS
koolkampus
 
PPTX
Csc concepts
Ashwin Ananthapadmanabhan
 
PPTX
High volume real time contiguous etl and audit
Remus Rusanu
 
PDF
8 application servers_v2
ashish61_scs
 
PDF
CS9222 ADVANCED OPERATING SYSTEMS
Kathirvel Ayyaswamy
 
PPT
Mq presentation
xddu
 
PPTX
Event Driven Architectures - Phoenix Java Users Group 2013
clairvoyantllc
 
PPTX
Event Driven Architectures
Avinash Ramineni
 
PPTX
Moving "Something Simple" To The Cloud - What It Really Takes
CloverDX
 
PPT
MQPresentation.ppt
BalakoteswaraReddyM
 
PPT
10135 a 05
Bố Su
 
PDF
540slidesofnodejsbackendhopeitworkforu.pdf
hamzadamani7
 
PPTX
Mail server using Linux(Ubuntu)
Navjot Navi
 
ODP
The Art of Message Queues
Mike Willbanks
 
PPT
message passing
Ashish Kumar
 
PPT
Realtime Communication Techniques with PHP
WaterSpout
 
How to build more reliable, robust and scalable distributed systems
Lars-Erik Kindblad
 
Making communication across boundaries simple with Azure Service Bus
Particular Software
 
24. Advanced Transaction Processing in DBMS
koolkampus
 
High volume real time contiguous etl and audit
Remus Rusanu
 
8 application servers_v2
ashish61_scs
 
CS9222 ADVANCED OPERATING SYSTEMS
Kathirvel Ayyaswamy
 
Mq presentation
xddu
 
Event Driven Architectures - Phoenix Java Users Group 2013
clairvoyantllc
 
Event Driven Architectures
Avinash Ramineni
 
Moving "Something Simple" To The Cloud - What It Really Takes
CloverDX
 
MQPresentation.ppt
BalakoteswaraReddyM
 
10135 a 05
Bố Su
 
540slidesofnodejsbackendhopeitworkforu.pdf
hamzadamani7
 
Mail server using Linux(Ubuntu)
Navjot Navi
 
The Art of Message Queues
Mike Willbanks
 
message passing
Ashish Kumar
 
Realtime Communication Techniques with PHP
WaterSpout
 
Ad

More from Lars-Erik Kindblad (13)

PPTX
Application Architecture April 2014
Lars-Erik Kindblad
 
PPTX
Application Architecture
Lars-Erik Kindblad
 
PPTX
Unit Tests are Overrated (NDCOslo 2013)
Lars-Erik Kindblad
 
PPTX
Publish & Subscribe to events using an Event Aggregator
Lars-Erik Kindblad
 
PPTX
The Single Responsibility Principle
Lars-Erik Kindblad
 
PPTX
Avoid code duplication! Principles & Patterns
Lars-Erik Kindblad
 
PPTX
Application Architecture by Lars-Erik Kindblad, Capgemini
Lars-Erik Kindblad
 
PPTX
The Fluent Interface Pattern
Lars-Erik Kindblad
 
PPTX
Inversion of Control - Introduction and Best Practice
Lars-Erik Kindblad
 
PPTX
Layered Software Architecture
Lars-Erik Kindblad
 
PPTX
Introduction to FluentData - The Micro ORM
Lars-Erik Kindblad
 
PPTX
Dependency Injection vs Service Locator - Best Practice
Lars-Erik Kindblad
 
PPTX
Data Access - Best Practice
Lars-Erik Kindblad
 
Application Architecture April 2014
Lars-Erik Kindblad
 
Application Architecture
Lars-Erik Kindblad
 
Unit Tests are Overrated (NDCOslo 2013)
Lars-Erik Kindblad
 
Publish & Subscribe to events using an Event Aggregator
Lars-Erik Kindblad
 
The Single Responsibility Principle
Lars-Erik Kindblad
 
Avoid code duplication! Principles & Patterns
Lars-Erik Kindblad
 
Application Architecture by Lars-Erik Kindblad, Capgemini
Lars-Erik Kindblad
 
The Fluent Interface Pattern
Lars-Erik Kindblad
 
Inversion of Control - Introduction and Best Practice
Lars-Erik Kindblad
 
Layered Software Architecture
Lars-Erik Kindblad
 
Introduction to FluentData - The Micro ORM
Lars-Erik Kindblad
 
Dependency Injection vs Service Locator - Best Practice
Lars-Erik Kindblad
 
Data Access - Best Practice
Lars-Erik Kindblad
 
Ad

Recently uploaded (20)

PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PDF
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PDF
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 

Message Oriented Architecture using NServiceBus

  • 1. Message Oriented Architecture using NServiceBus Lars-Erik Kindblad Senior Consultant Twitter: @kindblad E-mail: [email protected]
  • 2. What is NServiceBus?  Lightweight messaging framework for designing distributed systems in .NET  An Enterprise Service Bus  Helps to make distributed systems more  Reliable  Scalable  Extensible  Founded in 2006 by UDI Dahan, an international renowned expert on software architecture and design  Services and support provided by Particular Software  Open Source but not free  Source code available at https://github.com/Particular/NServiceBus  Binaries available as NuGet packages
  • 3.  Remote Procedure Call (Request/Response) Request: Order Website Response: Order ID Order Service PlaceOrder(order) Synchronous – The website is blocked while calling the Order Service  Messaged Oriented Architecture (One-way messaging) Message: PlaceOrder Website Message Queue Connect Receive PlaceOrder message Windows Service Process the PlaceOrder message Asynchronous – The website is NOT blocked while the place order is processed
  • 4. NServiceBus Terminology & Components Sender /Send-Only Endpoint Message, Command or Event Message: PlaceOrder Website Message Queue Connect Receive PlaceOrder message Windows Service Process the PlaceOrder message Message Handler Worker Endpoint, Host or Receiver
  • 5. Messages in NServiceBus  Just simple .NET classes with properties  2 types of messages  Command • 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
  • 6.  Command Strongly coupled to the receiving endpoint Command: PlaceOrder Website Command: PlaceOrder Message Queue Endpoint  Event (Publish/Subscribe) Subscribing Endpoint Loosely coupled to the receiving endpoints Event: OrderWasPlaced Worker NServiceBus will add 3 messages to the queue, one for each subscriber Event: OrderWasPlaced Message Queue Subscribing Endpoint Subscribing Endpoint
  • 7. Queues  First in-first out datastructure for storing and retrieving messages PlaceOrder message 4 First-In Queue PlaceOrder message 3 PlaceOrder message 2 PlaceOrder message 1 First-Out  Default queue in NServiceBus is Microsoft Message Queuing (MSMQ)  Available on all Windows editions since NT 4 and Windows 95  Also support for      ActiveMQ RabbitMQ SQL Server Windows Azure Queues Windows Azure ServiceBus  One endpoint has one queue, Send-Only endspoints do not have queues
  • 8. How to Send & Handle Messages Command: PlaceOrder Website Send Command: PlaceOrder Message Queue Endpoint Handle (Command or Event)
  • 9. Summary  Sender endpoint  Sends a message  Can be a website, desktop application or even a worker endpoint  Command  Message where we want to do something concrete  ICommand interface  Event  Message where we notify about something that has happened  IEvent interface  Message handler  Processes a given message  IHandleMessages<Message> interface  Worker endpoint  Finds and executes the handler for the message  Can be a Windows Service, console application, WCF, website
  • 10. NServiceBus Requirements  MSMQ (default) or any other supported queue      ActiveMQ RabbitMQ SQL Server Windows Azure Queues Windows Azure ServiceBus  Distributed Transaction Cordinator (DTC)  RavenDB (default) or a relational database  Download the installer from NServiceBus from http://particular.net/ to setup the required components
  • 11. NuGet packages  NServiceBus Interfaces  Interfaces that we need to define messages  NServiceBus  Most of the code that drives NServiceBus except hosting  Use for send-only endpoints  NServiceBus Host  Console application that can be installed as a Windows Service  Used to process/handle messages  NServiceBus Testing  Framework for testing NServiceBus endpoints
  • 12. The Case – The eBook Shop 1. Create the order in the database 2. Auto-pay the order using a previously stored credit card 3. Send an order confirmation by e-mail 4. Deliver the book to the Windows Phone device
  • 13. The Usual Way - Request/Response Place order 1. Add order Browser OrderController Confirmation page with order ID Database 2. Charge credit card PaymentService 3. Send mail SMTP-Server 4. Deliver ebook DeviceService
  • 14. Problem #1 – The order is lost during an error Place order 1. Add order Browser OrderController Database Error page Exception 2. Charge credit card Error PaymentService 3. Send mail SMTP-Server 4. Deliver ebook DeviceService  Conseqence  The database is rolled back  User receives an error  Order must be sent again
  • 15. Problem #2 – Poor Transaction Management Place order 1. Add order Browser OrderController Database Error page 2. Charge credit card PaymentService 3. Send mail SMTP-Server Exception 4. Deliver ebook Error DeviceService  Conseqence:  The credit card is charged (no transaction support)  A mail saying the order was successful was sent (no transaction support)  The order do not exist in the database (supports transaction – rolled back)  The user will receive an error
  • 16. Let’s Fix This With NServiceBus  Change to a message oriented architecture Add PlaceOrder message Place order Browser Queue OrderController Confirmation page Old New
  • 17. The Message Must Also Be Processed MSMQ 1. Connect 2. Receive message PlaceOrder Worker (Windows Service) PlaceOrder 3. PlaceOrder Message Handler 4. Add order Database 5. Charge credit card PaymentService 6. Send mail SMTP-Server 7. Deliver ebook DeviceService
  • 18. When an Error Occur 4. Rollback. Put the message back on the queue and retry MSMQ 1. Connect 2. Receive message PlaceOrder Worker (Windows Service) PlaceOrder 3. PlaceOrder Error Message Handler
  • 19. More about MSMQ  Max 4MB message size  Persists messages to files. Default location C:WINDOWSSystem32msmqstorage  Guranteed once-and-only-once delivery  The message will only be handled once  Supports transactional queues and distributed transactions (using DTC)  If an error occur both changes to the database and to the queue can be rolled back  Supports store-and-forward  MSMQ will store messages locally before forwarding it to the queue on another server  MSMQ will confirm when the message has been written to the disk in the outgoing queue, not when it has been delivered to the server  Important feature for distributed systems with unrealiable networks Server A Sender MSMQ Outgoing queue Server B Message MSMQ Input queue Worker
  • 20. How NServiceBus Handles Failure  Transaction management and rollback are automatically handled by NServiceBus in message handlers  When an error occur 1. The message is put back on the queue 2. Attempt to process the message 5 times, wait for 10 seconds 3. Attempt to process the message 5 times, wait for 20 seconds 4. Attempt to process the message 5 times, wait for 30 seconds 5. Attempt to process the message 5 times, send the message to an error queue The time interval is configurable  Messages can be moved back to the original queue for replay using ReturnToSourceQueue.exe tool.
  • 21. A challenge – The Order ID Old New  The order ID has not been generated yet – it’s generated in the message handler at the worker endpoint
  • 22. Possible Solutions  Change the UI to not show the order ID  Use a GUID (Guid.NewGuid()) or find another way to generate the ID in the controller instead of in the database • message.OrderId = Guid.NewGuid(); Bus.Send(message); ViewBag.OrderId = message.OrderId; • 5773DD0E-0AB0-446B-8649-B2D43D7DA4AA is not a very user friendly ID  Move OrderRepository.Add(order) to the Controller: • var orderId = OrderRepository.Add(order); Bus.Send(message); • Less reliable and more error prone solution  Use Send/Reply to simulate request/response • The controller will wait for a PlaceOrderCompleted message that the PlaceOrder handler will send • Too much overhead • An Anti-pattern
  • 23. We Still Have Poor Transaction Management 1. Add order Handle PlaceOrder Database 2. Charge credit card PaymentService 3. Send mail SMTP-Server 4. Deliver ebook Exception Error DeviceService  Conseqence:  The credit card is charged (no transaction support)  A mail saying the order was successful was sent (no transaction support)  The order do not exist in the database (supports transaction – rolledback)  The message is put back on the queue and will be retried = credit card will be charged twice
  • 24. Solution  Split into man small messages - One message per transactional boundary Place order OrderController Browser 1. Add PlaceOrder message PlaceOrder message 2. Handle PlaceOrder Add PayOrder message If an error occur only DeliverEbook is affected. The message will be put back on the queue and retried SendMail message 4. Handle SendMail DeliverEbook message 5. Handle DeliverEbook PayOrder message Queue Add SendMail & DeliverEbook message 3. Handle PayOrder
  • 25. Code - The Messages
  • 26. Code – Message Handlers #1
  • 27. Code – Message Handlers #2
  • 28. Yet another transactional issue MSMQ Processed ok Handle PayOrder message Charge credit card Request Handle PayOrder Request: Error PaymentService Payment OK Network error External Payment Gateway  The message will be put back on the queue and processed again  Consequence: The credit card will be charged more than once
  • 29. Solution  Operations should be idempotent  Idempotent operations can be run many times without changing the result MSMQ Handle PayOrder message Charge credit card Request Handle PayOrder Payment OK PaymentService Has the order been paid? Use OrderId Database Payment OK External Payment Gateway Has the message already been processed? Use order ID or a GUID Database
  • 30. Another Challenge – Eventual Consistency Users clicks on View Order History  The PlaceOrder message is processed async by another process  If it has not gotten processed yet then the new order will not be in the list  Solution  Some UI trick?  Move the OrderRepository.Add to the controller  Make sure the messages are handled fast enough • Define a SLA on the message to help monitoring
  • 31. Publish/Subscribe Place order OrderController Browser 1. Add PlaceOrder message PlaceOrder command 2. Handle PlaceOrder Add PayOrder command With Publish/Subscribe the Subscribers are loosely coupled to the publisher Subscribe to OrderWasPaid 4. Handle SendMail Subscribes to OrderWasPaid Queue 3. Handle PayOrder Add OrderWasPaid event OrderWasPaid Subscribes to OrderWasPaid 4. Handle DeliverEbook PayOrder command OrderWasPaid NServiceBus will add 2 messages to the queue, one for each subscriber
  • 32. Summary Request/Response Command Event X X Automatically retries X X Full transactional support X X Reliable Consistency X Can return ID generated by the database to the sender X Loosely coupled X  Reads is synchronous and should be request/response  Using a queue for synchronous operations gives little value, only overhead  Writes can be asynchronous one-way messaging or events  There are no silver bullet – We are always trading one set of problems for another set of problems
  • 33. Scaling  Scale up  Easy to scale up if business processes are split into multiple messages  Increase the number of threads in the config – NServiceBus will concurrently process multiple messages  Scale out  Use the Distributor or the Master (Both a distributor and a worker) Worker #1 Message MSMQ Distributor Worker #2 Worker #3  The distributor will forward the message to a worker that is ready to process the message
  • 34. How the Distributor Works 1. Worker: Send I’m ready message I’m ready message Distributor: Control Queue I’m ready message Distributor Any messages in the input queue? PlaceOrder message 1. Website: Send PlaceOrder message Send PlaceOrder message from input queue PlaceOrder message Distributor Input Queue Yes No PlaceOrder message Distributor Find worker through message in Storage queue Store I’m ready message Storage Queue
  • 35. Other Features  Sagas  Long running workflow like processes  State is shared between multiple message handlers  Scheduling  Send a message every x minute. A handler will handle the message  Unobtrusive mode  Use your own ICommand, IEvent etc. to reduce coupling to NServiceBus  Supports  Various dependency injection containers  Logging frameworks  Etc.  ++
  • 36. NServiceBus License & Pricing  Open source  Used to be free, but not anymore  Indefinitely license with 1 year maintenance updates • $500 USD per processing core • $250 USD per sending core  Monthly subscription • $35 USD per processing core • $17 USD per sending core  Development and testing environments + disaster recovery and passive backups are free  Developers need a license (free) that must be renewed every 3rd month through particular.net
  • 37. Demo
  • 38. About Capgemini With more than 120,000 people in 40 countries, Capgemini is one of the world's foremost providers of consulting, technology and outsourcing services. The Group reported 2011 global revenues of EUR 9.7 billion. Together with its clients, Capgemini creates and delivers business and technology solutions that fit their needs and drive the results they want. A deeply multicultural organization, Capgemini has developed its own way of working, the Collaborative Business ExperienceTM, and draws on Rightshore ®, its worldwide delivery model. Rightshore® is a trademark belonging to Capgemini www.capgemini.com The information contained in this presentation is proprietary. © 2012 Capgemini. All rights reserved.