reliable integrations with nservicebus

70
Reliable integrations with NServiceBus Andreas Öhlund Enterprise Development Expert

Upload: andreasohlund

Post on 29-Jan-2018

2.689 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Reliable integrations with NServiceBus

Reliable integrationswith NServiceBus

Andreas ÖhlundEnterprise Development Expert

Page 2: Reliable integrations with NServiceBus

Agenda

• War story

• Dragons and how to manage them

• A “saga” with a happy ending

• Q & A

Page 3: Reliable integrations with NServiceBus
Page 4: Reliable integrations with NServiceBus
Page 5: Reliable integrations with NServiceBus
Page 6: Reliable integrations with NServiceBus
Page 7: Reliable integrations with NServiceBus
Page 8: Reliable integrations with NServiceBus
Page 9: Reliable integrations with NServiceBus

Fact:A trip to dragon territory cantake a while...

Page 10: Reliable integrations with NServiceBus

The usual waypublic void Handle(OrderPlaced message){

var order = new Order{ Id = message.OrderID };

order.TrackingCode = fedex.BookPickup(order); order.Status = ShippingStatus.PickupBooked;

repository.Save(order);}

Page 11: Reliable integrations with NServiceBus

The usual waypublic void Handle(OrderPlaced message){

var order = new Order{ Id = message.OrderID };

order.TrackingCode = fedex.BookPickup(order); order.Status = ShippingStatus.PickupBooked;

repository.Save(order);}

2:

3:

Page 12: Reliable integrations with NServiceBus

The usual waypublic void Handle(OrderPlaced message){

var order = new Order{ Id = message.OrderID };

order.TrackingCode = fedex.BookPickup(order); order.Status = ShippingStatus.PickupBooked;

repository.Save(order);}

This might take a while!2:

3:

Page 13: Reliable integrations with NServiceBus

Fact:Dragons doesn’t support transactions.

Page 14: Reliable integrations with NServiceBus

TX

Database rollback

DB

Order

Store

Ship

Page 15: Reliable integrations with NServiceBus

TX

Database rollback

DB

Order

Store

Ship

Page 16: Reliable integrations with NServiceBus

TX

Database rollback

DB

Order

Store

Ship

Page 17: Reliable integrations with NServiceBus

No TXSupport

TX

Database rollback

DB

Order

Store

Ship

Page 18: Reliable integrations with NServiceBus

No TXSupport

TX

Database rollback

DB

Order

Store

Ship

Did we just loose an order?

Page 19: Reliable integrations with NServiceBus

No TXSupport

TX

Database rollback

DB

Order

Store

Ship

Page 20: Reliable integrations with NServiceBus

No TXSupport

TX

Database rollback

DB

Order

Store

Ship

Order Http

Page 21: Reliable integrations with NServiceBus

Design guideline

“Interact with non transactional resources using separate endpoints”

Page 22: Reliable integrations with NServiceBus

R# Extract endpoint public void Handle(OrderPlaced message){ repository.Save(new Order { Id = message.OrderID, Status = ShippingStatus.AwaitingShipment });

bus.Send<BookShipment>(m => { m.OrderID = message.OrderID; });}

Page 23: Reliable integrations with NServiceBus

R# Extract endpoint public void Handle(OrderPlaced message){ repository.Save(new Order { Id = message.OrderID, Status = ShippingStatus.AwaitingShipment });

bus.Send<BookShipment>(m => { m.OrderID = message.OrderID; });}

Page 24: Reliable integrations with NServiceBus

R# Extract endpoint public void Handle(OrderPlaced message){ repository.Save(new Order { Id = message.OrderID, Status = ShippingStatus.AwaitingShipment });

bus.Send<BookShipment>(m => { m.OrderID = message.OrderID; });}

Page 25: Reliable integrations with NServiceBus

R# Extract endpoint

public void Handle(ShipmentBooked message){

var order = repository.Get<Order>(message.OrderID);

order.TrackingCode = message.TrackingCode;

repository.Save(order);}

Page 26: Reliable integrations with NServiceBus

TX

Consistency across rollbacks

Order

Page 27: Reliable integrations with NServiceBus

TX

Consistency across rollbacks

Order

DBStore

Page 28: Reliable integrations with NServiceBus

TX

Consistency across rollbacks

Order

DBStore

Book shipment MQ

Page 29: Reliable integrations with NServiceBus

TX

Consistency across rollbacks

Order

DBStore

Book shipment MQ

Page 30: Reliable integrations with NServiceBus

TX

Consistency across rollbacks

Order

DBStore

Book shipment MQ

Page 31: Reliable integrations with NServiceBus

TX

Consistency across rollbacks

Order

DBStore

Book shipment MQ

Page 32: Reliable integrations with NServiceBus

Not all return from a trip to the dragons

Fact:Not everyone will make it back.

Page 33: Reliable integrations with NServiceBus

TX

What happens if the response is lost?

BookShipment

Fedex.Ship

Page 34: Reliable integrations with NServiceBus

TX

What happens if the response is lost?

BookShipment

Fedex.Ship

TimeoutException

Page 35: Reliable integrations with NServiceBus

TX

What happens if the response is lost?

BookShipment

Fedex.Ship

TimeoutException

Page 36: Reliable integrations with NServiceBus

Commit

TX

What happens if the response is lost?

BookShipment

Fedex.Ship

TimeoutException

Page 37: Reliable integrations with NServiceBus

IntegrationEndpoint

IdempotencyBookShipment

Page 38: Reliable integrations with NServiceBus

IntegrationEndpoint

IdempotencyBookShipment

http://fedex.com/ship ?id=xyz123

Page 39: Reliable integrations with NServiceBus

Commit

IntegrationEndpoint

IdempotencyBookShipment

http://fedex.com/ship ?id=xyz123

Page 40: Reliable integrations with NServiceBus

Commit

IntegrationEndpoint

IdempotencyBookShipment

http://fedex.com/ship ?id=xyz123

TimeoutExceptionX

Page 41: Reliable integrations with NServiceBus

Commit

IntegrationEndpoint

IdempotencyBookShipment

http://fedex.com/ship ?id=xyz123

http://fedex.com/ship?id=xyz123

TimeoutExceptionX

Page 42: Reliable integrations with NServiceBus

Commit

IntegrationEndpoint

IdempotencyBookShipment

http://fedex.com/ship ?id=xyz123

Discard

http://fedex.com/ship?id=xyz123

TimeoutExceptionX

Page 43: Reliable integrations with NServiceBus

Commit

IntegrationEndpoint

IdempotencyBookShipment

http://fedex.com/ship ?id=xyz123

Discard

http://fedex.com/ship?id=xyz123

TimeoutExceptionX

Page 44: Reliable integrations with NServiceBus

Commit

IntegrationEndpoint

IdempotencyBookShipment

http://fedex.com/ship ?id=xyz123

Discard

http://fedex.com/ship?id=xyz123

TimeoutExceptionX

ShipmentBooked

Page 45: Reliable integrations with NServiceBus

Fact:A trip to the dragons may be costly.

Page 46: Reliable integrations with NServiceBus

Timeouts vNext

• Thread.Sleep is not a good solution

• Need a way to have durable timeouts

• The NServiceBus timeout manager solves this for us

Page 47: Reliable integrations with NServiceBus

Fact:Dragons have home turf advantage.

Page 48: Reliable integrations with NServiceBus

Scalable integrations

• Manage traffic peaks

• Allow you to control the pace

Use throttling to:

Page 49: Reliable integrations with NServiceBus

A more scalable design

Client Server

Page 50: Reliable integrations with NServiceBus

A more scalable design

Client Server

Request

Page 51: Reliable integrations with NServiceBus

A more scalable design

Client Server

Request Send

Page 52: Reliable integrations with NServiceBus

A more scalable design

Client Server

Request

Ticket - come back in Thttp://fedex.com/responses/xyz123

Send

Page 53: Reliable integrations with NServiceBus

A more scalable design

Client Server

Request

Ticket - come back in Thttp://fedex.com/responses/xyz123

Send

CacheRecv

Page 54: Reliable integrations with NServiceBus

A more scalable design

Client Server

Request

Ticket - come back in Thttp://fedex.com/responses/xyz123

} T

http://fedex.com/responses/xyz123

Send

CacheRecv

Page 55: Reliable integrations with NServiceBus

A more scalable design

Client Server

Request

Ticket - come back in Thttp://fedex.com/responses/xyz123

} T

http://fedex.com/responses/xyz123

Response / come back in T2

Send

CacheRecv

Page 56: Reliable integrations with NServiceBus

A more scalable design

Client Server

Request

Ticket - come back in Thttp://fedex.com/responses/xyz123

} T

http://fedex.com/responses/xyz123

Response / come back in T2

Send

CacheRecv

Page 57: Reliable integrations with NServiceBus

A more scalable design

Client Server

Request

Ticket - come back in Thttp://fedex.com/responses/xyz123

} T

http://fedex.com/responses/xyz123

Response / come back in T2

Send

CacheRecv

Page 58: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

ManagerFedex

Page 59: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

Manager

Get ticket

Fedex

Page 60: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

Manager

Get ticket

Fedex

Page 61: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

Manager

Get ticket

Fedex

Page 62: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

Manager

Wake me up in T

Get ticket

Fedex

Page 63: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

Manager

Wake me up in T

Get ticket

Fedex

Page 64: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

Manager

Wake me up in T

Get ticket

Get Data

Fedex

Page 65: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

Manager

Wake me up in T

Get ticket

Get Data

Fedex

Page 66: Reliable integrations with NServiceBus

Using sagas to control message flow

BookShipment

IntegrationSaga

FedexEndpointTimeout

Manager

Wake me up in T

Get ticket

Get Data

Fedex

Page 67: Reliable integrations with NServiceBus

Code...

Page 68: Reliable integrations with NServiceBus
Page 69: Reliable integrations with NServiceBus

Thanks for listening!

Page 70: Reliable integrations with NServiceBus

Thanks for listening!

Andreas ÖhlundEnterprise Development Expert