Upload
adam-fyles
View
2.236
Download
1
Embed Size (px)
DESCRIPTION
Introduction to the open source ESB NServiceBus
Citation preview
INTRODUCTION TO
NSERVICEBUSAdam Fyles
Solution Architect
AdamFyles.blogspot.com
Why use a service bus?
• Definition
• “a software architecture construct which provides fundamental
services for complex architectures via an event-driven and
standards-based messaging engine (the bus).” – Wikipedia
• Building Systems vs. Applications
Application
System
The 8 fallacies of distributed computing
1. The network is reliable
2. Latency isn‟t a problem
3. Bandwidth isn‟t a problem
4. The network is secure
5. The topology won‟t change
6. The administrator will know what to do
7. Transport cost isn‟t a problem
8. The network is homogeneous
• Deutsch „94, Gosling „97
Coupling
• Platform• Interoperability matters( Fallacy #8 )
• Proprietary vs. Standard protocols
• Schema & Contract – XML
• Spatial• Server A relies on Server B
• Can communication continue?
• Store & Forward
• Temporal• The processing of B affects that of A
• Request/Response
• Asynchronous Messaging
Windows Linux
RPC
Scalability & Flexibility
• Flexibility
• What about upgrades?
• What about virtualization?
• Scalability
• Scaling Up vs. Out – don‟t get stuck with one option
• The Grid – work distribution
Messaging to the Rescue!
• Communication between services and Endpoints is
described by message patterns
• Durable
• Flexible
• Unidirectional – non-blocking
• Less coupling
• NServiceBus provides several messaging patterns out of
the box, but allows for the composition and/or creation of
new patterns
Example
Transaction
DB
Queue
App
Order
RollbackRollback
Call 1 of 3
Call 2 of 3
Order is back in the queue
Endpoint
NSB Process Flow Overview
Scan /bin for Types
Configuration
Wait for Messages
Scan IoC & Dispatch Handlers
• IWantCustomLogging
• IProfile
• IConfigureThisEndPoint
• AsA_Server
• IWantToRunAtStartup
• IMessage
• ISpecifyMessageOrderHandling
• IHandleMessages<T>
Generic Host
NServiceBus.Host.exe
Point to Point
2
BusClient
Bus
Server
Bus.Send()
Point to Point Configuration
Client
class EndPointConfig : IConfigureThisEndpoint, AsA_Client{ }
<UnicastBusConfig><MessageEndpointMappings><add Messages="MyMessages“ Endpoint="MyServerInputQueue" />
</MessageEndpointMappings></UnicastBusConfig>
Server
class EndPointConfig : IConfigureThisEndpoint, AsA_Server{ }
<MsmqTransportConfig InputQueue="MyServerInputQueue" />
Point to Point Demo
Bus
Bus
Request & Response
3
Client
Server
Bus.Send(), Bus.Reply()
Bus
Publish & Subscribe
5
Subscription
Storage
Publisher
BusSubscriber
Bus
Subscriber
Bus
Subscriber
Bus.Publish(), Bus.Subscribe(), Bus.Unsubscribe()
Pub/Sub ConfigurationSubscriber
class EndPointConfig : IConfigureThisEndpoint, AsA_Server{ }
<MsmqTransportConfig InputQueue=Subscriber1InputQueue" />
<UnicastBusConfig><MessageEndpointMappings><add Messages="MyMessages" Endpoint=" MyPublisherInputQueue" />
</MessageEndpointMappings></UnicastBusConfig>
Publisher
class EndPointConfig : IConfigureThisEndpoint, AsA_Publisher{ }
<MsmqTransportConfig InputQueue="MyPublisherInputQueue />
Pub/Sub Demo
Scaling Out
Distributor
2
Work
ManagementDistributor
Bus
Worker
Bus
Worker
Bus
Worker
Distributor Config<appSettings><add key="NumberOfWorkerThreads" value="1"/><!-- queue that the distributor process reads and feeds to workers --><add key="DataInputQueue" value="nservicebus_distributor_data_bus"/>
<!--queue that manages work distribution --><add key="ControlInputQueue“
value="nservicebus_distributor_control_bus"/>
<!-- errors --><add key="ErrorQueue" value="nservicebus_error"/>
<!-- queue that maintains the state(availability) of the workers --><add key="StorageQueue" value="nservicebus_distributor_storage"/>
<!-- relevant for a Serialization of "interfaces" or "xml" --><add key="NameSpace" value="http://www.MySite.com"/>
<add key="Serialization" value="xml"/><!-- can be either "xml", or "binary" -->
</appSettings>
Demo
Long Running Workflows(Sagas)
Saga(Workflow)
22
State
Persistence
Main
Business
ProcessBus
Sub
Process
3
Bus
Sub
Process
1 Bus
Sub
Process 2
Are we done yet?
Saga ConfigurationServer
class EndPointConfig : IConfigureThisEndpoint, AsA_Server{ }
<MsmqTransportConfig InputQueue=MySagaInputQueue" />
<UnicastBusConfig><MessageEndpointMappings><add Messages="MyMessages" Endpoint="MyDestinationInputQueue" /><add Messages=“NServiceBus.Saga.TimeoutMessage” Endpoint=“timeoutmanager” />
</MessageEndpointMappings></UnicastBusConfig>
<NHibernateSagaPersisterConfig><NHibernateProperties>
<add Key="connection.provider“ Value="NHibernate.Connection.DriverConnectionProvider"/>
<add Key="connection.driver_class" Value="NHibernate.Driver.SqlClientDriver"/><add Key="connection.connection_string" Value="Server=localhost;initial
catalog=NServiceBus;Integrated Security=SSPI"/><add Key="dialect" Value="NHibernate.Dialect.MsSql2000Dialect"/>
</NHibernateProperties></NHibernateSagaPersisterConfig>
Summary
• The Bus architectural style typically prompts more
questions
• What happens if communication fails?
• How long can it take for a process to complete?
• What is my process dependent on and what depends on my
process?
• Is ok to lose an order(or other entity)?
• Is this truly a domain event?
• NServiceBus provides the plumbing, you must provide the
System
THANK YOUAdam Fyles
Solution Architect
AdamFyles.blogspot.com
GitHub.com/afyles
NServiceBus.com
Credits: Udi Dahan, NSB Author