Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Einführung in NServiceBus

Ähnliche Präsentationen


Präsentation zum Thema: "Einführung in NServiceBus"—  Präsentation transkript:

1 Einführung in NServiceBus
2. Kassel .NET Usergroup Alexander Bremora

2 Wer kennt NServiceBus? ?

3 Code zu schreiben ist … EINFACH … solange

4 … solange man weiß, … was einen erwartet

5 Aber was tun, wenn … … bestimmte Aspekte nicht vorauszusehen sind?

6 Denn nur, weil … Deine Software extrem schnell auf Deiner Maschine läuft Deine lokale Datenbank noch niemals einen Timeout verursacht hat Dein Netzwerk immer zu 100% performt Deine WebServices 24/7 erreichbar sind … geht trotzdem mal was schief

7 Ein Bus Framework hilft beim …
Design von Event-Driven Systemen (Event Sourcing, CQRS) Entkoppeln von Zuständigkeiten & Ressourcen (SRP) Automatische Fehlerbehandlung (Retry) Abstahiert Queues RPC Wrapper Single Responsibility Principle Datenbank Services LASTVERARBEITUNG (threading, cloud handlers) Sheduling

8 Was brauche ich dafür? Das Framework NServiceBus
Transport Technologien ( Queues vs. Broker) DB Persistenz (z.B. für Subscriber)

9 Wie fange ich an? NuGet NServiceBus NuGet NServiceBus.Host
Nachricht definieren Konfiguration einrichten (Typen, Ziel, …) Nachricht senden/publishen Nachricht handeln

10 Host yourself Du kannst dein Endpoint selber hosten oder
Du kannst NServiceBus.Host nutzen NServiceBus.Host nutzt Topshelf unter der Haube NServiceBus.Host führt Deinen Host als Windows Service oder Konsolenapplikation aus Startup & Cleanup

11 Unterschiede zu v5 zu v6 Minimum .NET 4.5.2 (empfohlen > 4.6.1)
Alle Transportoperation sind async IEndpointInstance (erbt von IMessageSession) ersetzt IBus EndpointConfiguration ersetzt BusConfiguration IHandleMessage Signatur hat sich geändert Task Handle(T message, IMessageHandlerContext context) Methodennamen wurden größtenteils beibehalten V6 seit Oktober 2016 NServiceBus v5 Minium .NET 4.5 Migrationsanleitung ist online EndpointConfiguration(Endpointname) Ibus hat viele Properties und Methoden die nicht in allen Szenarien anwendbar sind (und eine Exception schmeißen) Mit Handle() ist ein Injecten von Ibus nicht mehr erforderlich Kein async suffix: Noise, Kompatibilität Doppelte Peformance message/sec for noop

12 Unterschiede zu v5 zu v6 TransportConfig ist obsolet. Nur über Code oder eigene ConfigClass  IWantToRunWhenBusStartsAndStops -> IWantToRunWhenEndpointStartsAndStops Kleinvieh: Namespaces umgezogen, Namesänderungen, API Änderungen, Correleated Properties für Saga, Deprecated Serializer, Sender-Side Distrubution ersetzt Distributor Pattern (MSMQ) v5 Support: Bis 24. September 2017 Migrationsanleitung ist online First Level Retries (FLR) has been renamed to Immediate Retries. Second Level Retries (SLR) have been renamed to Delayed Retries.

13 Magie Assembly scanning für Tasks Typen / Handler Interfaces
IConfigureThisEndpoint IWantToRunWhenEndpointStartsAndStops AutoSubscription Tasks endpointConfiguration.LimitMessageProcessingConcurrencyTo(1); While we default to max(2, NumberOfLogicalProcessors) concurrent messages, you can configure the value to whatever you like:

14 Message Handling public class Handler : IHandleMessages<OrderBeerCommand> { public Task Handle(OrderBeerCommand message, IMessageHandlerContext context) { Console.WriteLine($"Beer order received. Amount: {message.Amount}"); return Task.CompletedTask; // return Task.FromResult(0); // for < .NET 4.6 // return null; // Never do this! This will result in an Exception } Handlers sind stateless! Nutze Sagas, wenn Du einen State brauchst. IMessageSession außerhalb, IMessageHandlerContext innerhalb von Handlers nutzen

15 DEMO Client OrderBeerCommand Server Replay
static async Task<IEndpointInstance> CreateEndpoint() { var endpointName = "KasselDotNet.NServiceBus.BeerPup.Client"; Console.Title = endpointName; var endpointConfiguration = new EndpointConfiguration( endpointName: endpointName); endpointConfiguration.AuditProcessedMessagesTo("audit"); endpointConfiguration.SendFailedMessagesTo("error"); endpointConfiguration.UseSerialization<JsonSerializer>(); endpointConfiguration.EnableInstallers(); endpointConfiguration.UsePersistence<InMemoryPersistence>(); return await Endpoint.Start(endpointConfiguration) .ConfigureAwait(false); }

16 Konfiguration - Code public class EndpointConfig : IConfigureThisEndpoint { public void Customize(EndpointConfiguration endpointConfiguration) { endpointConfiguration.UsePersistence<InMemoryPersistence>(); endpointConfiguration.UseSerialization<JsonSerializer>(); // default endpointConfiguration.UseTransport<MsmqTransport>(); // default endpointConfiguration.SendFailedMessagesTo("error"); endpointConfiguration.AuditProcessedMessagesTo("audit"); // Change default directory for logging. Only via code :-( //var defaultFactory = LogManager.Use<DefaultFactory>(); //defaultFactory.Directory("pathToLoggingDirectory"); var recoverability = endpointConfiguration.Recoverability(); recoverability.Immediate( immediate => { immediate.NumberOfRetries(3); }); recoverability.Delayed( delayed => { delayed.NumberOfRetries(3).TimeIncrease(TimeSpan.FromSeconds(2)); }} Error Queue: Für alle Nachrichten, die wiederholt fehlschlagen Audit Queue: Für alle erfolgreich verarbeiteten Nachrichten

17 Konfiguration – app.config
<configSections> <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> <section name="AuditConfig" type="NServiceBus.Config.AuditConfig, NServiceBus.Core" /> <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" /> </configSections> <MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/> <AuditConfig QueueName="audit"/> <UnicastBusConfig> <MessageEndpointMappings> <add Assembly="KasselDotNet.NServiceBus.Core" Type="KasselDotNet.NServiceBus.Core.OrderBeerCommand" Endpoint="KasselDotNet.NServiceBus.BeerPub.Server" /> </MessageEndpointMappings> </UnicastBusConfig>

18 Bus (Broker) Technology
MSMQ RabbitMQ Azure Service Bus Azure Store Queues SQL Server Legacy: WebSphereMQ

19 Persistenz InMemory RavenDB NHibernate Azure Storage SQL Persistence
Community Solutions Entity Framework MongoDB PostgreSQL In-Memory A volatile RAM based storage mainly used for development purposes. Can also be used where the storage is not required to persist between process restarts. RavenDB Uses the RavenDB document database for storage. NHibernate Uses custom NHibernate to persist data to an ADO.net data store (e.g. SQL Server). MSMQ A subscription only storage on top of MSMQ. Azure Storage Uses Azure Tables Storage for storage SQL Persistence Uses Json.NET to serialize data and store in a SQL database.

20 Event vs. Command Commands ist als Arbeitsauftrag für einen Empfänger vorgesehen Sender & Receiver Nutze ICommand als Markerinterface Call IMessageSession.Send(); Events ist als Benachrichtigung für mehrere Empfänger bestimmt Publisher & Subscriber Nutze IEvent als Markerinterface Call IMessageSession.Publish(); Reply erben von Basisinterface IMessage

21 Dependency Injection Built-in DI Support für: Autofac CastleWindsor
endpointConfiguration.RegisterComponents( registration: configureComponents => { configureComponents.ConfigureComponent<PromotionService>(DependencyLifecycle.SingleInstance); }); Support für: Autofac CastleWindsor Ninject SimpleInjector Spring StructureMap Unity

22 Unobtrusive Mode Messages können über Konventionen „gekennzeichnet“ werden Markerinterface IMessage, ICommand, IEvent entfallen Keine Abhängigkeit zu NServiceBus mehr erforderlich

23 DEMO Events registrieren Dependency Injection Client OrderBeerCommand
Server PickUpYourBeerCommand BeerWasDrunkEvent GuestDisplay Events registrieren Dependency Injection

24 Outbox 1 Seit NServiceBus v5
Dient als Ersatz für Distrubuted Transaction Coordinator (DTC) Verwaltet unterschiedliche Transaktionen Verfügbar für NHibernate & RavenDB Outbox DB == Business Data DB Beispiel: Entität + Event mit Entität-ID DTC ist ein Service von Microsoft ressourcenübergreifend Transaktionen abbilden zu können (Beispiel MSQM und SqlServer) Besonders für Cloud, RabbitMQ (Default)

25 Outbox 2 Deduplication Process (Dedup)
Filtert bereits verarbeiterte Nachrichten heraus Speicherung MessageIDs + Business Data + Outgoing Messages Mehrfache Outgoing Messages möglich Werden von Dedup als identische Nachrichten erkannt ACHTUNG: Vermischung von DTC & Outbox innerhalb eines System kann zu Datenduplikation führen. DTC Endpoint muss zwingend idempotent sein!

26

27 Outbox 3 endpointConfiguration.EnableOutbox(); endpointConfiguration.SetTimeToKeepDeduplicationData(TimeSpan.FromDays(7)); endpointConfiguration.SetFrequencyToRunDeduplicationDataCleanup(TimeSpan.FromMinutes(1)); Für Transport mit Unterstützung für DTC (MSMQ, SqlServer) muss zusätzlich folgende Config gesetzt werden: <appSettings> <add key="NServiceBus/Outbox" value="true" /> </appSettings>

28 Unit Of Work public class MyUnitOfWork : IManageUnitsOfWork {
public Task Begin() { Console.WriteLine("-- MyUnitOfWork Start --"); return Task.CompletedTask; } public Task End(Exception ex = null) { Console.WriteLine("-- MyUnitOfWork End --"); endpointConfiguration.RegisterComponents( registration: components => { components.ConfigureComponent<MyUnitOfWork>(DependencyLifecycle.InstancePerCall); });

29 Particular Service Platform
ServiceControl (the brain) ServiceInsight ServicePulse

30 Service Control Zentraler Dienst der Information zu jeder Nachricht sammelt Nutzt audit & error Queue Nutzt Embedded RavenDB Schlecht dokumentierte API unter Audit messages werden nach 30 Tagen gelöscht Error messages bleiben bestehen Eigene aktive Benachrichtung: Handle ServiceControl.Contracts.MessageFailed event

31 Service Insight Applikation, um alle Nachrichtenflüsse zu visualisieren Nachrichten filtern Fehlgeschlagene Nachrichten erneut verarbeiten Nutzt, die REST-API von ServiceControl Für Saga Nuget Pascket installieren

32 ServicePulse WebApplikation, die uns Zahlen und Werte zum System anzeigt Gruppiert fehlerhafte Nachrichten Zeigt die Aktivität von Endpoints auf (Heartbeat Nuget) Bietet die Möglichkeit Nachrichten erneut auszuführen Externe Überwachung durch Custom Checks Nutzt REST-API von ServiceControl

33 DEMO Unit Of Work Service Control Service Insight Client
OrderBeerCommand Server PickUpYourBeerCommand BeerWasDrunkEvent GuestDisplay Unit Of Work Service Control Service Insight

34 Tips Nutze Commands, wenn Du sichergehen willst, dass Deine Nachrichten ankommen Idemotenz! Idemotenz! Idemotenz! PerformanceCounter Logging anpassen Möglichst keine großen Datenmengen Async/await Stolpersteine vermeiden Fachliche Fehler müssen gehandelt werden Fehler werden in ServiceControl DB gespeichert. Clonen von Umgebungen schwierig Trenne Audit Refactoring (Rename, Namespace) machen Retries (fast) unmöglich await ConfigureAwait(false) Immer task return

35 Lizenz / Kosten Lizenztypen: SaaS Royality-free Elastic Cloud
Internal use Startups

36

37 Monitoring

38 Quellen improvements-in-nservicebus-6.0

39 Lust auf mehr? Ein paar Stichwörter: NServiceBus Pipeline Security
MessageMutors Message Headers Outbox Sagas Sheduling Security Test Sender-Side Distrubution

40 Die letzte Seite Alexander Bremora E-Mail: alex at bremora . com
GitHub:


Herunterladen ppt "Einführung in NServiceBus"

Ähnliche Präsentationen


Google-Anzeigen