34
NSERVICEBUS Inspired by: The course authored by Udi Dahan Oslo/Fagdag Espen Ekvang/Tomas Jansson 01/03/2013

Introduction to NServiceBus

Embed Size (px)

DESCRIPTION

Workshop given @ BEKK Fagdag March 1st 2013 together with Tomas Jansson

Citation preview

Page 1: Introduction to NServiceBus

NSERVICEBUS

Inspired by: The course authored by Udi Dahan

Oslo/Fagdag

Espen Ekvang/Tomas Jansson

01/03/2013

Page 2: Introduction to NServiceBus

AGENDA 2

• Intro

• Messaging and queues

• Testing

• SOA

• Saga

Page 3: Introduction to NServiceBus

INTRO 3

• Fallacies of distributed computing

• Why NServiceBus?

• Bus vs. Broker

• Service orientation

• Excercises

Page 4: Introduction to NServiceBus

FALLACIES OF DISTRIBUTED COMPUTING 4

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

Cant’ assume WHEN the message will arrive,

IF AT ALL

Page 5: Introduction to NServiceBus

WHY NSERVICEBUS 5

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

NServiceBus addresses the first five directly

The most developer-friendly service bus for SOA on .NET

Page 6: Introduction to NServiceBus

BUS VS. BROKER 6

Buss.dll

App

Buss.dll

App

Buss.dll

App

App

App App

Broker

• Bus is not necessarily physically separate

• Simpler; no routing or service fail over

• No single point of failure

Page 7: Introduction to NServiceBus

TENETS OF SERVICE ORIENTATION 7

• Services are autonomous

• Share contract & schema, not class or type

• Boundaries are explicit

• Compatibitility is base on Policy

Page 8: Introduction to NServiceBus

LAYERS & COUPLING 8

UI

BL

DAL

DB

Sales Shipping CRM

Tight coupling

Loose coupling

Referential Integrity

Reintroduces coupling

Page 9: Introduction to NServiceBus

WHEN CAN I WRITE SOME CODE? 9

• Getting started

• New class library

• Install-Package NServiceBus.Host

• Logging

• NServiceBus uses log4net, you can configure logging in app.config

• Default output is console

Page 10: Introduction to NServiceBus

EXERCISES 10

HELLO WORLD LOGGING

Page 11: Introduction to NServiceBus

MESSAGING AND QUEUES 11

• Store & forward

• Dangers of store & forward

• Request/Response

• Messaging and NServiceBus

• Exercises

Page 12: Introduction to NServiceBus

SERVER

STORE & FORWARD 12

MSMQ

OUTGOING INCOMING

CLIENT

MSMQ

OUTGOING INCOMING

Store & Forward writes to disk

Resilient in the face of failures

Page 13: Introduction to NServiceBus

DANGERS OF STORE & FORWARD 13

• If target is offline for an extended period of timemessages can fill up the disk

• Can cause a server to crash

• Especially problematic in B2B integration

• 1 MB/message, 100 message/sec = 6GB/minute

• Solution – discard messages after a while

• Use [TimeToBeReceived("00:01:00")] on the message definition

Page 14: Introduction to NServiceBus

REQUEST/RESPONSE 14

SERVER

MSMQ

OUTGOING INCOMING

CLIENT

MSMQ

OUTGOING INCOMING

Client can’t assume when a response will arrive, if at all

Equivalent to 2 one-way messages

Page 15: Introduction to NServiceBus

REQUEST/RESPONSE 15

• Message is sent from the server to the client’s queue If the client is offline, message sits in the server machine’s outgoing queue

• Client is not blocked until response arrives

• If two requests were sent, responses may arrive out of order

Page 16: Introduction to NServiceBus

WARNING! THIS IS NOT RPC 16

• Do NOT try to implement regular request/response patterns on top of messaging

• The client should be designed so that it can continue operating if a response never comes

Differences from RPC

• RPC is easy to code

• After invoking a web service

• Next line of code assumes we’ve got a response

• RPC problems

• Can’t reason about the time between one line of code and another

• Messaging makes this all explicit

Page 17: Introduction to NServiceBus

MESSAGING AND NSERVICEBUS 17

SERVER

MSMQ

OUTGOING INCOMING

CLIENT

MSMQ

OUTGOING INCOMING

Transaction

Page 18: Introduction to NServiceBus

DEFINE A MESSAGE 18

• Preferably inherit from IEvent or ICommand

• Use IMessage when replying using Bus.Reply()

• Also possible to define your own convention

• Configure.DefiningMessagesAs(t=>MyOwnConvention(t))

• Add properties like a regular class/interface

• Keep contract definintions in their own assembly/project

public class MyEvent: IEvent {}

Page 19: Introduction to NServiceBus

INSTANTIATE A MESSAGE 19

• var myMessage = new MyMessage();

• var myMessage = Bus.CreateInstance<MyMessage>();

Page 20: Introduction to NServiceBus

SEND A MESSAGE 20

Bus.Send(messageObject);

Can instantiate and send together (useful for interfaces):

Bus.Send<IMessage>((message) =>

{

message.Prop1 = value1;

message.Prop2 = value2;

});

Page 21: Introduction to NServiceBus

SPECIFY DESTINATION 21

1. Bus.Send(destination, messages); Requires that application manages routing

2. Configure destination for message type. In <UnicastBusConfig>, under <MessageEndpointMappings> specify one of the following: - <add Messages="assembly" Endpoint="destination"/> - <add Messages="type" Endpoint="destination"/>

3. Specify destination using - QueueName@ServerName , or - Just QueueName for the same machine

Page 22: Introduction to NServiceBus

HANDLE A MESSAGE 22

Write a class that implements IHandleMessages<T> where T is a message type

public class MyHandler : IHandleMessages<MyMessage>

{

public void Handle(MyMessage message)

{

}

}

Remember to specify in <UnicastBusConfig>, under <MessageEndpointMappings> one of the following: - <add Messages="assembly" Endpoint="source"/> - <add Messages="type" Endpoint="source"/>

Page 23: Introduction to NServiceBus

CONFIGURING AN ENDPOINT 23

When configuring an endpoint inherit from

1. Using AsA_Client will

- use non-transactional MsmqTransport - purge its queue of messages on startup - processes messages using its own permissions, not those of the message sender

2. Using AsA_Server will - use transactional MsmqTransport - not purge its queue of messages on startup, hence fault-tolerant - processes messages using the permissions of the sender (impersonation)

3. Using AsA_Publisher will

- extends AsA_Server

- indicates to the infrastructure that a storage for subscription request is to be set up

Page 24: Introduction to NServiceBus

EXERCISES 24

ONE-WAY MESSAGING (CLIENT) PROCESSING MESSAGES (SERVER) EXCEPTIONS

Page 25: Introduction to NServiceBus

UNIT TESTING MESSAGE HANDLERS 25

Available from NuGet using

Install-Package NServiceBus.Testing

Provides the ability to set expectations around how message handlers handle messages

• Expect: Send, Reply, Publish, etc...

Test.Initialize();

Test.Handler<MyHandler>()

.ExpectPublish<MyMessage>(message => message.Prop1 == value1)

.OnMessage<SomeEvent>(someEvent =>

{

someEvent.Prop1 = inputValue1;

});

Page 26: Introduction to NServiceBus

EXERCISE 26

UNIT TESTING

Page 27: Introduction to NServiceBus

SAGA 27

• Definition

• Saga declaration

• Saga ending

• Saga testing

• Exercise

Page 28: Introduction to NServiceBus

SAGA - DEFINITION 28

A Saga:

• Is a pattern for implementing long-lived transaction by using a series of shorter transactions

• Holds relevant state to needed to process mulitple messages in a ”saga entity”

• Are initiated by a message (event/command)

Page 29: Introduction to NServiceBus

SAGA - DECLARATION 29

public class MyPolicy : Saga<MyPolicyData>,

IAmStartedByMessages<MyMessage1>,

IHandleMessages<MyMessage2>

{

public void Handle(MyMessage1 order)

public void Handle(MyMessage2 order)

}

• Methods are like regular message handling logic

• Sagas can be started by multiple messages (IAmStartedByMessages<T>)

• First messages should start saga, following messages should be processed by the same one

Page 30: Introduction to NServiceBus

SAGA – DECLARATION CONT. 30

public class MyPolicyData : ISagaEntity

{

public Guid Id { get; set; }

public string Originator { get; set; }

public string OriginalMessageId { get; set; }

}

Page 31: Introduction to NServiceBus

ENDING A SAGA 31

MarkAsComplete();

• Can call this from any method

• Causes the saga to be deleted

• Any data that you want retained should be sent on (or published) via a message

Page 32: Introduction to NServiceBus

UNIT TESTING A SAGA 32

Test.Saga<MyPolicy>()

.ExpectPublish<Message1>(/* check values */)

.ExpectSend<Message2>(/* check values */)

.ExpectReplyToOriginator<Message3>(/* check values */)

.When(saga => saga.Handle(myMessage));

/* check values */

message => return(message.Data == someValue);

Page 33: Introduction to NServiceBus

EXERCISE - SAGAS ROCK 33

Page 34: Introduction to NServiceBus

EXTRA EXERCISES 34

TIMEOUT CUSTOM XML NAMESPACE CONFIGURABLE ROUTING DEPENDENCY INJECTION WEB-APP HOSTING FULL DUPLEX DISTRIBUTION GROUP EXERCISE