Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
NServiceBus Alt.Net 20100511
1. Building enterprise
applications with
NServiceBus
Andreas Öhlund
onsdag den 12 maj 2010
2. What is a distributed
system?
“A distributed system is one in which the
failure of a computer you didn't even
know existed can render your own
computer unusable”
-Leslie Lamport
onsdag den 12 maj 2010
16. Receiving and
processing of messages
public class CompleteSaleMessageHandler:
CreateOrderCommand
IHandleMessages<CompleteSaleCommand>
{ OrderService
public void Handle(CompleteSaleCommand c)
{
...
}
}
onsdag den 12 maj 2010
17. Message Contracts
• Versioned by the owner
• Regular .Net Assembly
• Bound to a input queue
• class MyMessage :
IMessage
onsdag den 12 maj 2010
18. Throttling the load
• Manage traffic peaks
• Consumer controls the pace
• <MsmqTransportConfig
NumberOfWorkerThreads="3" />
onsdag den 12 maj 2010
19. What happens when the load
becomes to heavy for one server?
onsdag den 12 maj 2010
21. Building consistent systems
• Do we produce
predictable results even
under failure conditions?
• What about non
transactional sources?
onsdag den 12 maj 2010
22. Isolate non transactional sources as
separate endpoints
public void Handle(CompleteSaleCommand cmd)
{
var order = ....
orderRepository.Save(order)
smtpClient.Send(new MailMessage{...})
}
onsdag den 12 maj 2010
23. Isolate non transactional sources as
separate endpoints
public void Handle(CompleteSaleCommand cmd)
{
public void Handle(CompleteSaleCommand cmd)
{ var order = ....
orderRepository.Save(order)
var order = ....
orderRepository.Save(order)
bus.Send(new NotifyCustomerRequest
{
smtpClient.Send(new MailMessage{...})
} EmailAddress = customer.Email,
Body = “Order confirmation”
});
}
onsdag den 12 maj 2010
26. Messaging gives you a
chance to do better
• No more showing the users a WSOD
• Messages are replayable
• Async communication opens up a crucial
windows of time for corrections
onsdag den 12 maj 2010
34. Publishing
bus.Publish<IOrderAcceptedEvent>(x=>
{
ProductId = 123,
Quantity = 10
....
});
onsdag den 12 maj 2010
35. It’s hard to get it right
the first time around
onsdag den 12 maj 2010
36. Versioning events using interfaces
public interface IOrderAcceptedEvent2 :
IOrderAcceptedEvent
{
string SomeNewProperty{ get;set; }
}
onsdag den 12 maj 2010
37. Long running
transactions
onsdag den 12 maj 2010
38. Use sagas to model long
running transactions
public
class
MySaga
:
Saga<MySagaData>,
IAmStartedByMessages<Message1>,
IHandleMessages<Message2>
{
public
void
Handle(Message1
message)
{
//
code
to
handle
Message1
}
public
void
Handle(Message2
message)
{
//
code
to
handle
Message2
}
}
onsdag den 12 maj 2010
39. Storing state
public
class
MySagaData
:
IContainSagaData
{
//
the
following
properties
are
mandatory
public
virtual
Guid
Id
{
get;
set;
}
public
virtual
string
Originator
{
get;
set;
}
public
virtual
string
OriginalMessageId
{
get;
set;
}
}
onsdag den 12 maj 2010
40. Timeouts
public
void
Handle(Message1
message)
{
this.Data.SomeID
=
message.SomeID;
RequestTimeout(TimeSpan.FromHours(1),
"some
state");
}
public
override
void
Timeout(object
state)
{
//
some
business
action
like:
if
(!Data.Message2Arrived)
ReplyToOriginator(new
TiredOfWaitingForMessage2());
}
onsdag den 12 maj 2010
41. Configuration
Developers:
use code
Administrators:
use config files
onsdag den 12 maj 2010
42. Hosting options
• Custom hosting
• Website
• Smartclient
• Commandline
• Generic host
onsdag den 12 maj 2010
43. Using the Generic Host
public class EndpointConfig:
IConfigureThisEndpoint,
AsA_Publisher
{
}
onsdag den 12 maj 2010
44. Using profiles to adapt to different
environments
onsdag den 12 maj 2010
48. Don’t use messaging
for queries
• Queries need to return relatively fast
• No benefit from the robustness that NSB
gives
• Use NSB to cache data close and use native
apis to get at that data
onsdag den 12 maj 2010
49. The end
• www.nservicebus.com
• www.udidahan.com/blog
• andreasohlund.blogspot.com
onsdag den 12 maj 2010