myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE
   » Gadget für Windows
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin

Ressourcen
» guide to C#
» openbook: Visual C#
» openbook: OO
» MSDN Webcasts
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Netzwerktechnologien » Communicationsprotokoll für Microservices, Asynchron oder/und Synchron?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Communicationsprotokoll für Microservices, Asynchron oder/und Synchron?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
malignate
myCSharp.de-Mitglied

images/avatars/avatar-3206.png


Dabei seit: 18.02.2005
Beiträge: 739


malignate ist offline

Communicationsprotokoll für Microservices, Asynchron oder/und Synchron?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

wir planen testweise ein neues Buchungssystem auf der Basis von Microservices. Das wird erstmal ein Spiel und Testprojekt und es ist unklar, ob es jemals zum Einsatz kommen wird. Unser System muss Hotelbuchungen, Flüge, Mietwagen und Zusatzprodukte bedienen können. Außerdem natürlich noch mehrere Payment Provider usw.

Ein großes Problem unseres aktuellen Systems ist, dass es synchron arbeitet, d.h. der Benutzer klickt "Jetzt buchen" und dann kommt ein Spinner und wir haben 1 Minute alles abzuschließen. Das ist erstmal relativ wenig Zeit, wenn viele Produkte im Warenkorb sind. Außerdem gibt es immer mal wieder Fehler und Produkte können auch ausverkauft sein. Deshalb soll es in Zukunft asynchron arbeiten. Das heißt der Benutzer bekommt sofort eine Antwort "Buchung wird bearbeitet" und dann später eine Email, wenn alles abgeschlossen wird. Dadurch können wir auch manuell eingreifen und Alternativen anbieten, z.B. ein besseres Zimmer, falls das die Provision erlaubt.

Ein Teil der Kommunikation zwischen Services ist synchron (= Request/Response), z.B:

* Zahlung beginnen (generiert vll. nur einen Deeplink zu Paypal etc.)
* Produkt validieren (sind die Eingaben gültig etc.)

Ein Teil der Kommunikation auch asynchron (= Messaging):

* Bezahlung durchführen
* Produkt buchen
* Produkt stornieren

Für beide Probleme gibt es viele tolle Lösungen:

Synchron

* REST mit JSON
* gRPC
...

Asynchron

* Kafka
* RabbitMq
...

Jetzt wäre es super, wenn man das Kommunikationsprotokoll relativ kompakt halten könnte. Habt ihr Erfahrung mit irgendwelchen Alternativen die im Prinzip beide Kommunikationsmuster abdecken? z.B. Akka.NET, Orleans. Was sind da eure Erfahrungen?
20.03.2017 22:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
weismat
myCSharp.de-Mitglied

Dabei seit: 20.09.2005
Beiträge: 797
Entwicklungsumgebung: Vistual Studio 2015
Herkunft: Frankfurt am Main


weismat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich benutze in meinem Umfeld gRPC - das bietet beide Kommunikationsmuster an.
Mir persönlich gefällt daran, daß gRPC sehr kompakt ist und dass man damit viele Sprachen anbietet. Die Struktur mit den proto Files als plattformunabhängige Schnittstellen-Beschreibung finde ich sehr gut.
21.03.2017 07:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
malignate
myCSharp.de-Mitglied

images/avatars/avatar-3206.png


Dabei seit: 18.02.2005
Beiträge: 739

Themenstarter Thema begonnen von malignate

malignate ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich finde gRpc auch super und die Proto Files sind klasse, aber wie kann damit asynchrone Kommunikation machen? Ich meinte nicht Async I/O (Async Task usw.) sondern im Prinzip Messaging mit Queues / MessageBus usw.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von malignate am 21.03.2017 08:37.

21.03.2017 08:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
weismat
myCSharp.de-Mitglied

Dabei seit: 20.09.2005
Beiträge: 797
Entwicklungsumgebung: Vistual Studio 2015
Herkunft: Frankfurt am Main


weismat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Für einen Message Bus würdest Du Server streaming RPC benutzen.
Aber ein Message Bus ist im Sinne von Microservices ein Antipattern.
21.03.2017 09:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
malignate
myCSharp.de-Mitglied

images/avatars/avatar-3206.png


Dabei seit: 18.02.2005
Beiträge: 739

Themenstarter Thema begonnen von malignate

malignate ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich liebe Aussagen ohne Begründung, das erinnert mich immer an Religionen :D
21.03.2017 09:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
weismat
myCSharp.de-Mitglied

Dabei seit: 20.09.2005
Beiträge: 797
Entwicklungsumgebung: Vistual Studio 2015
Herkunft: Frankfurt am Main


weismat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Willst Du Punkt zu Punkt Verbindung über den Message Bus machen oder sollen alle lauschen? Bei Dir hört sich das nach letzterem an....
21.03.2017 09:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
malignate
myCSharp.de-Mitglied

images/avatars/avatar-3206.png


Dabei seit: 18.02.2005
Beiträge: 739

Themenstarter Thema begonnen von malignate

malignate ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich ziehe den Begriff MessageBus zurück ;).

Ich brauche in manchen Fällen eine Entkopplung und asynchrone Kommunikation. z.B. mit RabbitMq oder Kafka oder Azure Service Bus. In dieser asynchronen Kommunikation können auch Menschen beteiligt sein, weil sich manche Buchungsschritte und Fehlerbehandlungen (noch) nicht automatisieren lassen.

Das heißt im Kern habe ich eine Art ProcessManager der auf Events reagiert und daraufhin Events auslöst. Diese Events müssen jetzt von verschiedenen Services behandelt werden.

Ein Teil der Events sind im Prinzip an einem bestimmten Empfänger gerichtet, der auch mal Offline sein kann, z.B. Amadeus-Flug-Buchungssystem, andere Events werden z.B. von mehreren Services konsumiert. Beispielsweise wird wenn eine Buchung abeschlossen wird, eine Email versendet, eine Rechnung verschickt, ein Report aktualisiert und die Information an das Accounting System geschickt.

Ich könnte z.B. einfach Kafka oder EventStore für die asynchrone Kommunikation verwenden, müsste dann aber für die synchrone Kommunikation auch noch mit gRPC arbeiten. Die Frage ist, ob ich das auch irgendwie abstrahieren kann, bspw.

1. Ich kann natürlich ein Art Adapter schreiben, der beide Kommunikationsprotokolle für die Microservices kapselt. Wenn alle Services mit der gleichen Sprache arbeiten, kann ich das ja einfach als NuGet zur Verfügung stellen.

2. Ich könnte auch nur auf asynchrone Kommunikation setzen. Request / Reply ist aber nicht so einfach. Evtl. muss ich dann mit temporären Queues arbeiten, Timeouts werden schwieriger usw.
21.03.2017 10:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

images/avatars/avatar-2981.png


Dabei seit: 20.07.2008
Beiträge: 9.780
Herkunft: Süddeutschland


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Mich interessiert das selbst, da ich bislang auch keine Lösung dafür gefunden hab.

Wir machen das weiterhin aktuell mit Reactive Extensions und eigenen CQS-angelehnten Implementierungen.
AKKA haben wir wegen der extrem hohen Abhängigkeiten nicht gewollt.

Wenn Du was hast: lass es mich wissen :-)
21.03.2017 19:30 Beiträge des Benutzers | zu Buddylist hinzufügen
weismat
myCSharp.de-Mitglied

Dabei seit: 20.09.2005
Beiträge: 797
Entwicklungsumgebung: Vistual Studio 2015
Herkunft: Frankfurt am Main


weismat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es gibt übrigens ein neues Projekt  protoactor, das quasi gRPC für ein Actor-Framework benutzt. Bisher habe ich mich damit noch nicht beschäftigt, da für mich gRPC ausreicht - aber es scheint einige Aspekte von Dir abzubilden. (Supervision/Lifecycle events/State machines).
Dazu gab es bei  dotnetrocks vor kurzem eine sehr interessante Episode.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von weismat am 22.03.2017 08:39.

22.03.2017 08:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palin Palin ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.08.2011
Beiträge: 800
Entwicklungsumgebung: VB.net


Palin ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ein Arbeitskollege von mir hatte sich vor kurzen mit den Thema befasst für uns mal zu validieren was für Möglichkeiten es da für uns so gibt. Und auch mal zum Test ein paar Beispiele implementiert.

Das Grundlegende Ergebnis war, das wir wohl unsere Anforderungen nicht mit einer Technologie umsetzen können. Sondern eher mehrere in Kombination nutzen werden.
Mit einer seiner favorisierten Technologien, war in dem Rahmen auch gRPC.

Da es aber bei uns nicht dringend ist und ich denke das sich grade wegen IOT sich einiges tut kann. Haben wir es erst mal zurück gestellt.

Also falls du da was vernünftiges findest, wäre ich auch sehr interessiert.
22.03.2017 21:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2017 myCSharp.de-Team. Alle Rechte vorbehalten. 28.03.2017 17:56