24
~

NSBCon 2014 London - Mark Taling and Roy Cornelissen

Embed Size (px)

DESCRIPTION

Embracing NServiceBus - best practices by Mark Taling and Roy Cornelissen

Citation preview

Page 1: NSBCon 2014 London - Mark Taling and Roy Cornelissen

~

Page 2: NSBCon 2014 London - Mark Taling and Roy Cornelissen

~

Roy CornelissenSoftware Architect

@roycornelissen

Mark TalingLead Developer

@marktaling

Page 3: NSBCon 2014 London - Mark Taling and Roy Cornelissen

Where we started

Discovering NServiceBus

Multi tenancy

Saga’s

The evolution of NServiceBus

Performance considerations

Maintainability

NServiceBus in a brownfield

Wrap up

Q&A

Page 4: NSBCon 2014 London - Mark Taling and Roy Cornelissen

Inte

grat

ion

La

yer

Serv

ice

Laye

r

NIS

Pre

sen

tati

on

La

yer

Planning UI Reporting UI

customer external apps

Employee Self Service

Common Forecast Realization PaymentSchedule

Page 5: NSBCon 2014 London - Mark Taling and Roy Cornelissen

Monitoring & Control

Inte

grat

ion

La

yer

Serv

ice

Laye

r

NIS

Pre

sen

tati

on

La

yer

Planning UI Reporting UIEmployee Self

Service

Common Forecast PaymentSchedule

Service Bus

Integration Services

IS HRM

IS Payroll

IS Budget

IS Provisioning

IS Time

IS Point of Sale

Realization

Page 6: NSBCon 2014 London - Mark Taling and Roy Cornelissen
Page 7: NSBCon 2014 London - Mark Taling and Roy Cornelissen

Tenant ID

Tenant ID

Tenant ID

Tenant ID

Page 8: NSBCon 2014 London - Mark Taling and Roy Cornelissen

public class BuildPrincipalFromHeaders : IMutateIncomingMessages{

public object MutateIncoming(object message){

Thread.CurrentPrincipal = null;

string tenantId = Headers.GetMessageHeader(message, “urn:dv:tenantid”);

ICollection<Claim> claims = new List<Claim>();…claims.Add(new Claim(SecurityConstants.TenantIdClaim, tenantId));

var principal = new ClaimsPrincipal(new ClaimsIdentityCollection { new ClaimsIdentity(claims) });

Thread.CurrentPrincipal = principal;

return message;}

Page 9: NSBCon 2014 London - Mark Taling and Roy Cornelissen

public class SetHeadersFromPrincipal : IMutateOutgoingMessages{

public IBus Bus { get; set; }

public object MutateOutgoing(object message){

IClaimsIdentity identity =Thread.CurrentPrincipal.Identity as IClaimsIdentity;

string tenantId = identity.GetTenantId();

if (!string.IsNullOrWhiteSpace(tenantId)){

Bus.SetMessageHeader(message, “urn:dv:tenantid”, tenantId);}

return message;}

Page 10: NSBCon 2014 London - Mark Taling and Roy Cornelissen

- Multiple properties- Concatenation- IFindSaga

- ISagaPersister

Page 11: NSBCon 2014 London - Mark Taling and Roy Cornelissen

public class AdvancedRavenSagaPersister : RavenSagaPersister, ISagaPersister{private readonly RavenSessionFactory _sessionFactory;

public AdvancedRavenSagaPersister(RavenSessionFactory sessionFactory):base(sessionFactory)

{_sessionFactory = sessionFactory;

}

public new void Save(IContainSagaData saga){base.Save(saga);StoreMappingKeys(saga);

}

public new void Complete(IContainSagaData saga){RemoveMappingKeys(saga);base.Complete(saga);

}

void ISagaPersister.Save(IContainSagaData saga) { Save(saga); }

void ISagaPersister.Complete(IContainSagaData saga) { Complete(saga); }}

var document = _sessionFactory.Session.Include("SagaDocId").Load<SagaMappingIdentity>(mappingId);return _sessionFactory.Session.Load<TSagaData>(document.SagaId);

Page 12: NSBCon 2014 London - Mark Taling and Roy Cornelissen
Page 13: NSBCon 2014 London - Mark Taling and Roy Cornelissen
Page 14: NSBCon 2014 London - Mark Taling and Roy Cornelissen
Page 15: NSBCon 2014 London - Mark Taling and Roy Cornelissen

RequestUtcTimeout<PolicyRenewal>(TimeSpan.FromDays(300));

Page 16: NSBCon 2014 London - Mark Taling and Roy Cornelissen

Lessons learned- Upgrade regularly- Retry PoCs and assumptions- Beware of abstractions

Page 17: NSBCon 2014 London - Mark Taling and Roy Cornelissen

Keep yourtransactions on a diet

Design withparallelism in mind

{Tx}{Tx}{Tx}

[Unique] saga properties

Page 18: NSBCon 2014 London - Mark Taling and Roy Cornelissen
Page 19: NSBCon 2014 London - Mark Taling and Roy Cornelissen
Page 20: NSBCon 2014 London - Mark Taling and Roy Cornelissen
Page 21: NSBCon 2014 London - Mark Taling and Roy Cornelissen

UseTransport<Rfc1149>();

Page 22: NSBCon 2014 London - Mark Taling and Roy Cornelissen

NServiceBus is an opinionated framework

If it fits, it fits like a glove

Prepare to make concessions at first

Clean up later

Messaging makes totally different use cases possible

Requires a new mindset for everyone

Page 23: NSBCon 2014 London - Mark Taling and Roy Cornelissen

NServiceBus is a great

way to break open

existing architectures

Despite its flexibility and

pluggability, always follow

its design principles

Go with the flow, it solves

real life problems you

might not know you have

Page 24: NSBCon 2014 London - Mark Taling and Roy Cornelissen

~

Roy CornelissenSoftware Architect

@roycornelissen

Mark TalingLead Developer

@marktaling

blogs.infosupport.com