39
Einführung in NServiceBus 2. Kassel .NET Usergroup - 23.02.2017 Alexander Bremora

Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Einführung inNServiceBus2. Kassel .NET Usergroup - 23.02.2017

Alexander Bremora

Page 2: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Wer kennt NServiceBus?

23.02.2017 2v1

Page 3: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Code zu schreiben ist …

EINFACH23.02.2017 3

… solange

v1

Page 4: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

… solange man weiß,

… was einen erwartet

23.02.2017 4v1

Page 5: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Aber was tun, wenn …

… bestimmte Aspekte nicht vorauszusehen sind?

23.02.2017 5v1

Page 6: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 7: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 8: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Was brauche ich dafür?

Das Framework NServiceBus

Transport Technologien ( Queues vs. Broker)

DB Persistenz (z.B. für Subscriber)

23.02.2017 8v1

Page 9: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 10: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 11: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 12: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 13: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Magie

Assembly scanning für Typen / Handler

Interfaces IConfigureThisEndpoint

IWantToRunWhenEndpointStartsAndStops

AutoSubscription

Tasks endpointConfiguration.LimitMessageProcessingConcurrencyTo(1);

23.02.2017 13v1

Page 14: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 15: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

DEMO

23.02.2017 15

Client Server

OrderBeerCommand

v1

Page 16: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 17: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 18: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Bus (Broker) Technology

MSMQ

RabbitMQ

Azure Service Bus

Azure Store Queues

SQL Server

Legacy: WebSphereMQ

23.02.2017 18v1

Page 19: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Persistenz

InMemory

RavenDB

NHibernate

Azure Storage

SQL Persistence

Community Solutions Entity Framework

MongoDB

PostgreSQL

23.02.2017 19v1

Page 20: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 21: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 22: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

DEMO

Events registrieren

Dependency Injection

23.02.2017 22

Client Server

GuestDisplay

OrderBeerCommand

BeerWasDrunkEvent

v1

Page 23: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 24: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 25: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

23.02.2017 25v1

Page 26: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 27: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 28: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 29: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Particular Service Platform

ServiceControl (the brain)

ServiceInsight

ServicePulse

23.02.2017 29v1

Page 30: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 31: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 32: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 33: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

DEMO

Unit Of Work

Unobtrusive Mode

Service Control / Service Insight

23.02.2017 33

Client Server

GuestDisplay

OrderBeerCommand

PickUpYourBeerCommand

BeerWasDrunkEvent

v1

Page 34: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 35: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Lizenz / Kosten

Lizenztypen: SaaS

Royality-free

Elastic Cloud

Internal use

Startups

23.02.2017 35v1

Page 36: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

23.02.2017 36v1

Page 37: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 38: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

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

Page 39: Einführung in NServiceBus · 2017. 3. 5. · IEndpointInstance(erbt von IMessageSession) ersetzt IBus EndpointConfigurationersetzt BusConfiguration IHandleMessage Signatur hat sich

Die letzte Seite

Alexander Bremora

E-Mail: alex at kasseldot . net

Twitter: @mystackoverflow

GitHub: https://github.com/mystackoverflow/KasselDotNet.NServiceBus

23.02.2017 39v1