71
er ingen gåde....... 29. august 2012 @ ANUG Mogens Heller Grabe

Rebus er ingen gåde

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Rebus er ingen gåde

er  ingen  gåde.......  

29.  august  2012  @  ANUG  Mogens  Heller  Grabe  

Page 2: Rebus er ingen gåde

Agenda!•  Hvad er dit problem?!•  Hvordan kan det løses?!•  Rebus!!!Slides!!+ snak!!+ kode!

Page 3: Rebus er ingen gåde

Mogens Heller Grabe!!!!

[email protected]!@mookid8000!

http://mookid.dk/oncode!

Page 4: Rebus er ingen gåde

Hvad er dit problem?!

Page 5: Rebus er ingen gåde

For eksempel:!public class Køb : FinansielTransaktion {

public void Bogfør() { // (....) foreach(var d in Pantebrev.Debitorer) { d.TilmeldTilCprMatch(); d.InhentKreditstatus(); } foreach(var k in Pantebrev.Kauti(...)

}

Page 6: Rebus er ingen gåde

Long-lived transactions...!

Page 7: Rebus er ingen gåde

begin tran!

commit tran!

DoThis()!

DoThat()!

Page 8: Rebus er ingen gåde

begin tran!

commit tran!

DoThis()!

DoThat()!

commit tran!begin tran!

?!

Page 9: Rebus er ingen gåde

Async Reliable Messaging!

Page 10: Rebus er ingen gåde

Messaging!

Page 11: Rebus er ingen gåde

Reliable!

Page 12: Rebus er ingen gåde

Async!

Page 13: Rebus er ingen gåde
Page 14: Rebus er ingen gåde

Windows FTW!!!!11!

Page 15: Rebus er ingen gåde

Hvad er så det der “service bus” for noget?!

Page 16: Rebus er ingen gåde
Page 17: Rebus er ingen gåde
Page 18: Rebus er ingen gåde

Køkultur!

Page 19: Rebus er ingen gåde

Request/reply!

Page 20: Rebus er ingen gåde

Publish/subscribe!

Page 21: Rebus er ingen gåde

Process manager!

Page 22: Rebus er ingen gåde

NServiceBus!

Page 23: Rebus er ingen gåde

MassTransitRhino Service Bus!

Page 24: Rebus er ingen gåde

hmmm...!

Page 25: Rebus er ingen gåde

Rebus!•  Første mål:!– Request/reply + publish/subscribe!– Lavet efter NServiceBus-modellen!– Bedre fejlbeskeder!

Page 26: Rebus er ingen gåde

~ 400 linjer!!!

Page 27: Rebus er ingen gåde

Simpel og intuitiv konfigurationshistorie!

Page 28: Rebus er ingen gåde

Få, velvalgte features!

Page 29: Rebus er ingen gåde

Ingen doodleware!

Page 30: Rebus er ingen gåde

Rebus Core kun afhængig af .NET 4 BCL!

Page 31: Rebus er ingen gåde

Integration m. 3.partslibs via små, fokuserede assemblies!

Page 32: Rebus er ingen gåde

De bedste fejlbeskeder!

Page 33: Rebus er ingen gåde

Lav friktion!

Page 34: Rebus er ingen gåde

Rebus!•  Version 0.19.6!•  Ikke længere ~ 400 linjer!

! !=> 1.0 !!

Page 35: Rebus er ingen gåde

Rebus!•  Apache License v. 2!•  Kode på GitHub:

http://github.com/mookid8000/Rebus !

Page 36: Rebus er ingen gåde

Contributors!

Page 37: Rebus er ingen gåde

Rebus!•  install-package rebus –pre!•  evt. via!– rebus.castle.windsor!– rebus.structuremap!– rebus.mongodb!– rebus.ravendb!– rebus.log4net!–  (...)!

Page 38: Rebus er ingen gåde

Eksempel!•  Lillebitte kommunikation

mlm. 2 processer!

Page 39: Rebus er ingen gåde

Message!public class DoStuff { public DoStuff(string whatToDo) { WhatToDo = whatToDo; } public string WhatToDo { get; private set; } }

Page 40: Rebus er ingen gåde

Handler!public class DoStuffHandler : IHandleMessages<DoStuff> { public void Handle(DoStuff message) { // go ahead and do the stuff... } }

Page 41: Rebus er ingen gåde

Konfiguration!

new RebusBus(....whoa!!)

Page 42: Rebus er ingen gåde

Konfiguration!var a = new FaveContainerAdapter(container); Configure.With(a)

.Logging(l => l.Log4Net()) .Transport(t => t.UseMsmq(“input”, “error”)) .DetermineDestination(d => d.(....)

.CreateBus() .Start();

Page 43: Rebus er ingen gåde

Konfiguration!var busForEverydayUse = container.Resolve<IBus>(); var busForCertainAdvancedTasks = container.Resolve<IAdvancedBus>(); var messageContext = container.Resolve<IMessageContext>()

Page 44: Rebus er ingen gåde

Den rigtige måde!// lav konfigurationstryl med // Configure.With(containerAdapter)... // og så: public class HomeController : Controller { public HomeController(IBus bus) {...} } //... osv!

Page 45: Rebus er ingen gåde

Eksempel!•  Et vaskeægte

(kunstigt) integrationsscenarie!

Page 46: Rebus er ingen gåde
Page 47: Rebus er ingen gåde
Page 48: Rebus er ingen gåde
Page 49: Rebus er ingen gåde
Page 50: Rebus er ingen gåde
Page 51: Rebus er ingen gåde
Page 52: Rebus er ingen gåde

Sagde han “saga”?!

Page 53: Rebus er ingen gåde

Process manager!

Page 54: Rebus er ingen gåde

Saga!public class IntegrationSaga : Saga<IntegrationSagaData>, IAmInitiatedBy<SomethingHappened>, IHandleMessages<VerifyComplete> { public void Handle(SomethingHappened m) {...} public void Handle(VerifyComplete m) {...} }

Page 55: Rebus er ingen gåde

Saga!IntegrationSaga: public override void ConfigureHowToFindSaga() { Incoming<SomethingHappened>(s => s.Id) .CorrelatesWith(d => d.IdOfEvent); Incoming<VerifyComplete>(s => s.CorrId) .CorrelatesWith(d => d.CorrId); }

Page 56: Rebus er ingen gåde

Saga!IntegrationSaga: public void Handle(SomethingHappened m) { bus.Send(new DoIntegrate(...)); bus.Defer(TimeSpan.FromMinutes(2), new VerifyComplete(corrId)); }

Page 57: Rebus er ingen gåde

Eksempel!•  Et vaskeægte (lidt

mere ægte) integrationsscenarie!

Page 58: Rebus er ingen gåde
Page 59: Rebus er ingen gåde

Rebus’ venner!•  containers!– Autofac!– StructureMap!– Castle Windsor!– Unity!– Ninject!

Page 60: Rebus er ingen gåde

Rebus’ venner!•  logging!– Log4net!– NLog!

Page 61: Rebus er ingen gåde

Rebus’ venner!•  persistence!– SQL Server!– MongoDB!– RavenDB!– XML J!

Page 62: Rebus er ingen gåde

Rebus’ venner!•  transport!– MSMQ!

– RabbitMQ(*)!– AzureMQ(*)!

(*) umodne!

Page 63: Rebus er ingen gåde

Rebus’ venner!•  ofte inviteret til festen!– Topshelf!

Page 64: Rebus er ingen gåde

Extensibility!•  Grundlæggende!–  ISendMessages!–  IReceiveMessages!–  IActivateHandlers!–  IDetermineDestination!–  ISerializeMessages!–  IStoreSubscriptions!–  IStoreSagaData!–  IInspectHandlerPipeline!–  IErrorTracker!

Page 65: Rebus er ingen gåde

Extensibility!•  Supplerende!–  IAdvancedBus!

•  BeforeTransportMessage(bus, message)!•  AfterTransportMessage(bus, ex, message)!•  BeforeMessage(bus, message)!•  AfterMessage(bus, ex, message)!•  MessageSent(bus, dest, message)!•  PoisonMessage(bus, message)!

Page 66: Rebus er ingen gåde

Hvad nu?!

Battle-hardening!Distributør!Gateway!

(+ det løse)!

Page 67: Rebus er ingen gåde
Page 68: Rebus er ingen gåde

https://github.com/mookid8000/Rebus/wiki !

Page 69: Rebus er ingen gåde
Page 70: Rebus er ingen gåde

Mogens Heller Grabe!!!!

[email protected]!@mookid8000!

http://mookid.dk/oncode!

Tak for opmærksomheden!!

Page 71: Rebus er ingen gåde

Image credits!•  Lyserød pistol: http://www.desantisholster.com/desantis-blog/girl-meets-gun !•  Plastikkæder: http://www.stanchionwholesaler.com/products/chain/mc_000 !•  Trollface: http://www.thebuzzmedia.com/troll-face-high-resolution/ !•  Eat SOAP: http://narwhaler.com/img/b7/h/eat-soap-b7HC4R.jpg !•  Just soap:

http://kinlane-productions.s3.amazonaws.com/api-evangelist/soap.gif !