Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Einführung inNServiceBus2. Kassel .NET Usergroup - 23.02.2017
Alexander Bremora
Wer kennt NServiceBus?
23.02.2017 2v1
Code zu schreiben ist …
EINFACH23.02.2017 3
… solange
v1
… solange man weiß,
… was einen erwartet
23.02.2017 4v1
Aber was tun, wenn …
… bestimmte Aspekte nicht vorauszusehen sind?
23.02.2017 5v1
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
23.02.2017 6v1
Ein Bus Framework hilft beim …
Design von Event-Driven Systemen (Event Sourcing, CQRS)
Entkoppeln von Zuständigkeiten & Ressourcen (SRP)
Automatische Fehlerbehandlung (Retry)
Abstrahiert Bus Technologie (z.B. Queues)
23.02.2017 7v1
Was brauche ich dafür?
Das Framework NServiceBus
Transport Technologien ( Queues vs. Broker)
DB Persistenz (z.B. für Subscriber)
23.02.2017 8v1
Wie fange ich an?
Projekt als Class Library anlegen
NuGet NServiceBus
NuGet NServiceBus.Host
Nachricht definieren
Konfiguration einrichten (Typen, Ziel, …)
Nachricht senden/publishen
Nachricht handeln
23.02.2017 9v1
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
23.02.2017 10v1
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
23.02.2017 11v1
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
23.02.2017 12v1
Magie
Assembly scanning für Typen / Handler
Interfaces IConfigureThisEndpoint
IWantToRunWhenEndpointStartsAndStops
AutoSubscription
Tasks endpointConfiguration.LimitMessageProcessingConcurrencyTo(1);
23.02.2017 13v1
Message Handling
Handlers sind stateless! Nutze Sagas, wenn Du einen State brauchst.
IMessageSession außerhalb, IMessageHandlerContext innerhalb von Handlers nutzen
23.02.2017 14
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
}}
v1
DEMO
23.02.2017 15
Client Server
OrderBeerCommand
v1
Konfiguration - Code
23.02.2017 16
public class EndpointConfig : IConfigureThisEndpoint {public void Customize(EndpointConfiguration endpointConfiguration) {
endpointConfiguration.UsePersistence<InMemoryPersistence>();endpointConfiguration.UseSerialization<JsonSerializer>();endpointConfiguration.UseTransport<MsmqTransport>();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));
});}} v1
Konfiguration – app.config
23.02.2017 17
<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>
v1
Bus (Broker) Technology
MSMQ
RabbitMQ
Azure Service Bus
Azure Store Queues
SQL Server
Legacy: WebSphereMQ
23.02.2017 18v1
Persistenz
InMemory
RavenDB
NHibernate
Azure Storage
SQL Persistence
Community Solutions Entity Framework
MongoDB
PostgreSQL
23.02.2017 19v1
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();
23.02.2017 20v1
Dependency Injection
Built-in DI
23.02.2017 21
endpointConfiguration.RegisterComponents(registration: configureComponents => {
configureComponents.ConfigureComponent<PromotionService>(DependencyLifecycle.SingleInstance);});
Support für: Autofac CastleWindsor Ninject
SimpleInjector Spring StructureMap Unity
v1
DEMO
Events registrieren
Dependency Injection
23.02.2017 22
Client Server
GuestDisplay
OrderBeerCommand
BeerWasDrunkEvent
v1
Outbox 1
Seit NServiceBus v5
Dient als Ersatz für Distrubuted Transaction Coordinator (DTC)
Verfügbar für NHibernate & RavenDB
Outbox DB == Business Data DB
23.02.2017 23v1
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 & Outboxinnerhalb eines System kann zu Datenduplikation führen. DTC Endpoint muss zwingend idempotent sein!
23.02.2017 24v1
23.02.2017 25v1
Outbox 3
Für Transport mit Unterstützung für DTC (MSMQ, SqlServer) muss zusätzlich folgende Config gesetzt werden:
23.02.2017 26
endpointConfiguration.EnableOutbox();endpointConfiguration.SetTimeToKeepDeduplicationData(TimeSpan.FromDays(7));endpointConfiguration.SetFrequencyToRunDeduplicationDataCleanup(TimeSpan.FromMinutes(1));
<appSettings><add key="NServiceBus/Outbox" value="true" />
</appSettings>
v1
Unit Of Work
23.02.2017 27
endpointConfiguration.RegisterComponents(registration: components => {
components.ConfigureComponent<MyUnitOfWork>(DependencyLifecycle.InstancePerCall);});
public class MyUnitOfWork : IManageUnitsOfWork {public Task Begin() {
Console.WriteLine("-- MyUnitOfWork Start --");return Task.CompletedTask;
}
public Task End(Exception ex = null) {Console.WriteLine("-- MyUnitOfWork End --");return Task.CompletedTask;
}}
v1
Unobtrusive Mode
Messages können über Konventionen „gekennzeichnet“ werden
Markerinterface IMessage, ICommand, IEvent entfallen
Keine Abhängigkeit zu NServiceBus mehr erforderlich
23.02.2017 28v1
Particular Service Platform
ServiceControl (the brain)
ServiceInsight
ServicePulse
23.02.2017 29v1
Service Control
Zentraler Dienst der Information zu jeder Nachricht sammelt
Nutzt audit & error Queue
Nutzt Embedded RavenDB
Schlecht dokumentierte API unter http://localhost:33333/api
Audit messages werden nach 30 Tagen gelöscht
Error messages bleiben bestehen
Eigene aktive Benachrichtung: Handle ServiceControl.Contracts.MessageFailed event
23.02.2017 30v1
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 Packet installieren
23.02.2017 31v1
ServicePulse
WebApplikation, die uns Zahlen und Werte zum System anzeigt
Gruppiert fehlerhafte Nachrichten
Zeigt die Aktivität von Endpoints an (Heartbeat Nuget)
Bietet die Möglichkeit Nachrichten erneut auszuführen
Externe Überwachung durch Custom Checks
http://localhost:9090
Nutzt REST-API von ServiceControl
23.02.2017 32v1
DEMO
Unit Of Work
Unobtrusive Mode
Service Control / Service Insight
23.02.2017 33
Client Server
GuestDisplay
OrderBeerCommand
PickUpYourBeerCommand
BeerWasDrunkEvent
v1
Tips
Nutze Commands, wenn Du sichergehen willst, dass Deine Nachrichten ankommen
Idempotenz! Idempotenz! Idempotenz! 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 Server bei unabhängigen Systemen Refactoring (Rename, Namespace) machen Retries (fast) unmöglich
23.02.2017 34v1
Lizenz / Kosten
Lizenztypen: SaaS
Royality-free
Elastic Cloud
Internal use
Startups
23.02.2017 35v1
23.02.2017 36v1
Quellen
Learning NServiceBus - Second Edition (David Boike)
https://docs.particular.net/
https://support.nservicebus.com/blog/msmq-performance-improvements-in-nservicebus-6.0
23.02.2017 37v1
Lust auf mehr?
Ein paar Stichwörter:
NServiceBus Pipeline
MessageMutors
Message Headers
Outbox
Sagas
Sheduling
23.02.2017 38
Security
Test
Sender-Side Distrubution
v1
Die letzte Seite
Alexander Bremora
E-Mail: alex at kasseldot . net
Twitter: @mystackoverflow
GitHub: https://github.com/mystackoverflow/KasselDotNet.NServiceBus
23.02.2017 39v1