Einfhrung in NService Bus 2 Kassel NET Usergroup
Einführung in NService. Bus 2. Kassel. NET Usergroup - 23. 02. 2017 Alexander Bremora
Wer kennt NService. Bus? ? 23. 02. 2017 2
Code zu schreiben ist … EINFACH … solange 23. 02. 2017 3
… solange man weiß, … was einen erwartet 23. 02. 2017 4
Aber was tun, wenn … … bestimmte Aspekte nicht vorauszusehen sind? 23. 02. 2017 5
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 Web. Services 24/7 erreichbar sind … geht trotzdem mal was schief 23. 02. 2017 6
Ein Bus Framework hilft beim … Design von Event-Driven Systemen (Event Sourcing, CQRS) Entkoppeln von Zuständigkeiten & Ressourcen (SRP) Automatische Fehlerbehandlung (Retry) Abstahiert Queues 23. 02. 2017 7
Was brauche ich dafür? Das Framework NService. Bus Transport Technologien ( Queues vs. Broker) DB Persistenz (z. B. für Subscriber) 23. 02. 2017 8
Wie fange ich an? Nu. Get NService. Bus. Host Nachricht definieren Konfiguration einrichten (Typen, Ziel, …) Nachricht senden/publishen Nachricht handeln 23. 02. 2017 9
Host yourself Du kannst dein Endpoint selber hosten oder Du kannst NService. Bus. Host nutzen NService. Bus. Host nutzt Topshelf unter der Haube NService. Bus. Host führt Deinen Host als Windows Service oder Konsolenapplikation aus Startup & Cleanup 23. 02. 2017 10
Unterschiede zu v 5 zu v 6 Minimum. NET 4. 5. 2 (empfohlen > 4. 6. 1) Alle Transportoperation sind async IEndpoint. Instance (erbt von IMessage. Session) ersetzt IBus Endpoint. Configuration ersetzt Bus. Configuration IHandle. Message Signatur hat sich geändert Task Handle(T message, IMessage. Handler. Context context) Methodennamen wurden größtenteils beibehalten 23. 02. 2017 11
Unterschiede zu v 5 zu v 6 Transport. Config ist obsolet. Nur über Code oder eigene Config. Class IWant. To. Run. When. Bus. Starts. And. Stops -> IWant. To. Run. When. Endpoint. Starts. And. Stops Kleinvieh: Namespaces umgezogen, Namesänderungen, API Änderungen, Correleated Properties für Saga, Deprecated Serializer, Sender-Side Distrubution ersetzt Distributor Pattern (MSMQ) v 5 Support: Bis 24. September 2017 23. 02. 2017 12
Magie Assembly scanning für Typen / Handler Interfaces IConfigure. This. Endpoint IWant. To. Run. When. Endpoint. Starts. And. Stops Auto. Subscription Tasks endpoint. Configuration. Limit. Message. Processing. Concurrency. To(1); 23. 02. 2017 13
Message Handling public class Handler : IHandle. Messages<Order. Beer. Command> { public Task Handle(Order. Beer. Command message, IMessage. Handler. Context context) { Console. Write. Line($"Beer order received. Amount: {message. Amount}"); return Task. Completed. Task; // return Task. From. Result(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. IMessage. Session außerhalb, IMessage. Handler. Context innerhalb von Handlers nutzen 23. 02. 2017 14
DEMO Order. Beer. Command Client 23. 02. 2017 Server 15
Konfiguration - Code public class Endpoint. Config : IConfigure. This. Endpoint { public void Customize(Endpoint. Configuration endpoint. Configuration) { endpoint. Configuration. Use. Persistence<In. Memory. Persistence>(); endpoint. Configuration. Use. Serialization<Json. Serializer>(); // default endpoint. Configuration. Use. Transport<Msmq. Transport>(); // default endpoint. Configuration. Send. Failed. Messages. To("error"); endpoint. Configuration. Audit. Processed. Messages. To("audit"); // Change default directory for logging. Only via code : -( //var default. Factory = Log. Manager. Use<Default. Factory>(); //default. Factory. Directory("path. To. Logging. Directory"); var recoverability = endpoint. Configuration. Recoverability(); recoverability. Immediate( immediate => { immediate. Number. Of. Retries(3); }); recoverability. Delayed( delayed => { delayed. Number. Of. Retries(3). Time. Increase(Time. Span. From. Seconds(2)); }); 23. 02. 2017 }} 16
Konfiguration – app. config <config. Sections> <section name="Unicast. Bus. Config" type="NService. Bus. Config. Unicast. Bus. Config, NService. Bus. Core" /> <section name="Audit. Config" type="NService. Bus. Config. Audit. Config, NService. Bus. Core" /> <section name="Message. Forwarding. In. Case. Of. Fault. Config" type="NService. Bus. Config. Message. Forwarding. In. Case. Of. Fault. Config, NService. Bus. Core" /> </config. Sections> <Message. Forwarding. In. Case. Of. Fault. Config Error. Queue="error"/> <Audit. Config Queue. Name="audit"/> <Unicast. Bus. Config> <Message. Endpoint. Mappings> <add Assembly="Kassel. Dot. Net. NService. Bus. Core" Type="Kassel. Dot. Net. NService. Bus. Core. Order. Beer. Command" Endpoint="Kassel. Dot. Net. NService. Bus. Beer. Pub. Server" /> </Message. Endpoint. Mappings> </Unicast. Bus. Config> 23. 02. 2017 17
Bus (Broker) Technology MSMQ Rabbit. MQ Azure Service Bus Azure Store Queues SQL Server Legacy: Web. Sphere. MQ 23. 02. 2017 18
Persistenz In. Memory Raven. DB NHibernate Azure Storage SQL Persistence Community Solutions Entity Framework Mongo. DB Postgre. SQL 23. 02. 2017 19
Event vs. Commands ist als Arbeitsauftrag für einen Empfänger vorgesehen Sender & Receiver Nutze ICommand als Markerinterface Call IMessage. Session. Send(); Events ist als Benachrichtigung für mehrere Empfänger bestimmt Publisher & Subscriber Nutze IEvent als Markerinterface Call IMessage. Session. Publish(); 23. 02. 2017 20
Dependency Injection Built-in DI endpoint. Configuration. Register. Components( registration: configure. Components => { configure. Components. Configure. Component<Promotion. Service>(Dependency. Lifecycle. Single. Instance); }); Support für: Autofac Castle. Windsor Ninject 23. 02. 2017 Simple. Injector Spring Structure. Map Unity 21
Unobtrusive Mode Messages können über Konventionen „gekennzeichnet“ werden Markerinterface IMessage, ICommand, IEvent entfallen Keine Abhängigkeit zu NService. Bus mehr erforderlich 23. 02. 2017 22
DEMO Order. Beer. Command Client Server Pick. Up. Your. Beer. Command Beer. Was. Drunk. Events registrieren Dependency Injection 23. 02. 2017 Guest. Display 23
Outbox 1 Seit NService. Bus v 5 Dient als Ersatz für Distrubuted Transaction Coordinator (DTC) Verwaltet unterschiedliche Transaktionen Verfügbar für NHibernate & Raven. DB Outbox DB == Business Data DB Beispiel: Entität + Event mit Entität-ID 23. 02. 2017 24
Outbox 2 Deduplication Process (Dedup) Filtert bereits verarbeiterte Nachrichten heraus Speicherung Message. IDs + 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! 23. 02. 2017 25
23. 02. 2017 26
Outbox 3 endpoint. Configuration. Enable. Outbox(); endpoint. Configuration. Set. Time. To. Keep. Deduplication. Data(Time. Span. From. Days(7)); endpoint. Configuration. Set. Frequency. To. Run. Deduplication. Data. Cleanup(Time. Span. From. Minutes(1)); Für Transport mit Unterstützung für DTC (MSMQ, Sql. Server) muss zusätzlich folgende Config gesetzt werden: <app. Settings> <add key="NService. Bus/Outbox" value="true" /> </app. Settings> 23. 02. 2017 27
Unit Of Work public class My. Unit. Of. Work : IManage. Units. Of. Work { public Task Begin() { Console. Write. Line("-- My. Unit. Of. Work Start --"); return Task. Completed. Task; } public Task End(Exception ex = null) { Console. Write. Line("-- My. Unit. Of. Work End --"); return Task. Completed. Task; } } endpoint. Configuration. Register. Components( registration: components => { components. Configure. Component<My. Unit. Of. Work>(Dependency. Lifecycle. Instance. Per. Call); }); 23. 02. 2017 28
Particular Service Platform Service. Control (the brain) Service. Insight Service. Pulse 23. 02. 2017 29
Service Control Zentraler Dienst der Information zu jeder Nachricht sammelt Nutzt audit & error Queue Nutzt Embedded Raven. DB Schlecht dokumentierte API unter http: //localhost: 33333/api Audit messages werden nach 30 Tagen gelöscht Error messages bleiben bestehen Eigene aktive Benachrichtung: Handle Service. Control. Contracts. Message. Failed event 23. 02. 2017 30
Service Insight Applikation, um alle Nachrichtenflüsse zu visualisieren Nachrichten filtern Fehlgeschlagene Nachrichten erneut verarbeiten Nutzt, die REST-API von Service. Control Für Saga Nuget Pascket installieren 23. 02. 2017 31
Service. Pulse Web. Applikation, 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 http: //localhost: 9090 Nutzt REST-API von Service. Control 23. 02. 2017 32
DEMO Order. Beer. Command Client Server Pick. Up. Your. Beer. Command Beer. Was. Drunk. Event Unit Of Work Service Control Service Insight 23. 02. 2017 Guest. Display 33
Tips Nutze Commands, wenn Du sichergehen willst, dass Deine Nachrichten ankommen Idemotenz! Performance. Counter Logging anpassen Möglichst keine großen Datenmengen Async/await Stolpersteine vermeiden Fachliche Fehler müssen gehandelt werden Fehler werden in Service. Control DB gespeichert. Clonen von Umgebungen schwierig Trenne Audit Refactoring (Rename, Namespace) machen Retries (fast) unmöglich 23. 02. 2017 34
Lizenz / Kosten Lizenztypen: Saa. S Royality-free Elastic Cloud Internal use Startups 23. 02. 2017 35
23. 02. 2017 36
Monitoring 23. 02. 2017 37
Quellen https: //support. nservicebus. com/blog/msmq-performanceimprovements-in-nservicebus-6. 0 https: //docs. particular. net/ 23. 02. 2017 38
Lust auf mehr? Ein paar Stichwörter: NService. Bus Pipeline Message. Mutors Message Headers Outbox Sagas Sheduling 23. 02. 2017 Security Test Sender-Side Distrubution 39
Die letzte Seite Alexander Bremora E-Mail: alex at bremora. com Twitter: @mystackoverflow Git. Hub: https: //github. com/mystackoverflow 23. 02. 2017 40
- Slides: 40