Soll ich von WCF zu NserviceBus wechseln?

13

Wir haben einen zentralen Server, der Nachrichten von einer Reihe von PCs sendet und empfängt, die sich in Client-Netzwerken an verschiedenen Standorten befinden. Um dies zu erleichtern, verwende ich derzeit WCF mit TCPNetBindings und verwende Duplex-Kommunikation, die mit Zertifikaten gesichert ist.

Jetzt haben wir eine Reihe von Problemen damit - hauptsächlich, dass wir aufgefordert werden, den "getrennten Modus" zu unterstützen (wir müssen fehlertolerant sein). Soweit ich weiß, gibt es keine einfache Möglichkeit, dies mithilfe des WCF-Stacks zu tun - wir müssten etwas implementieren und möglicherweise msmq verwenden. Ich habe mir in letzter Zeit NServiceBus angeschaut und sehe, dass es gut zur Rechnung passt - Fehlertoleranz, Nachrichten können über ein einfaches http-Gateway usw. über das Internet gesendet werden Ich kann verstehen, warum das so ist, wenn ich es mir ansehe.

Meine Frage ist also ... Klingt der Einsatz von NServiceBus nach einer vernünftigen Idee, oder hat jemand andere Vorschläge / Erfahrungen aus der Praxis, die sich darauf beziehen? Ich glaube, ich mache mir Sorgen, eine neue Technologie einzuführen, die ich relativ wenig kenne, und Probleme mit der Sicherung, der zuverlässigen Einrichtung und weiteren Problemen zu haben. "Die Architektur plattieren" und etwas Glänzendes auswählen, das mich in der Implementierung stören wird, statt bei WCF zu bleiben und es nur für mich arbeiten zu lassen.

Vielen Dank!

Matt Roberts
quelle
1
> "Disconnected Mode" unterstützen (wir müssen fehlertolerant sein) Müssen Sie nicht immer noch einen Großteil der Fehlertoleranz auf der Client-Seite selbst aufbauen? Die Fehlertoleranz von MSMQ auf dem Server ist großartig, um den Status im Falle eines Problems wiederherzustellen, aber ich sehe immer noch, dass der Client große Kopfschmerzen hat, egal, was Sie gewählt haben.
Brian
1
Nun, was ich unterstützen muss, ist die "Garantie", dass der Client eine Nachricht an den Server sendet und der Server sie schließlich erhält. Wenn wir also offline sind, müssen wir es weiter versuchen, bis wir dort sind. Das ist, was NSB "kostenlos" tut, während als WCF-Lösung (glaube ich) Code erforderlich wäre.
Matt Roberts
Ich stimme Brian teilweise zu. Wenn MSMQ in den letzten Versionen richtig konfiguriert wurde, erhalten Sie einen ziemlich guten Modus für getrennte Verbindungen, solange Sie die Warteschlange und die Nachricht so konfigurieren, dass sie sich so verhalten. Der Client kann die Nachrichten in der lokalen ausgehenden Warteschlange beibehalten und erneut senden, wenn der Server wieder in einer Remotewarteschlange verfügbar ist.
Bill
WCF verfügt über MSMQ-Bindungen ... Ich kenne mich mit mehreren erfolgreichen Großanwendungen bestens aus, die davon Gebrauch machen. Das heißt, ich mag auch nServiceBus, aber es macht eine andere Sache.
Kyle Hodgson

Antworten:

12

Mein Vorschlag, wenn Sie schnell und einfach vorgehen müssen, um einen dauerhaften (getrennten) Betrieb mit WCF zu ermöglichen, ist ein Blick in die WCF-MSMQ-Bindungen. Wenn Sie in einer größeren Umgebung etwas benötigen, schauen Sie sich nServiceBus an.

In meinen Augen würde nServiceBus in einer größeren verteilten Umgebung wirklich zu glänzen beginnen. Nehmen Sie zum Beispiel das folgende Beispiel (das wäre die Hölle auf Erden mit WCF, aber einfach mit nServiceBus):

  • Infrastruktur bestehend aus App-Server-Schicht, Cache-Server-Schicht, Nur-Lese-Datenbankschicht und Lese- / Schreib-Datenbankschicht
  • Jedes Mal, wenn der Client einen neuen Eintrag einreicht, möchten Sie wirklich, dass alle Ebenen gleichzeitig aktualisiert werden
  • In WCF müssen Sie separate Dienste auf jeder Ebenenebene verfügbar machen und den Client dazu bringen, auf alle Dienste zuzugreifen (oder von einer zentralen Orchestrierung dasselbe für Sie tun lassen).
  • In nServiceBus müsste jede Schicht Abonnent dieser Informationen sein, und der Client würde sie einmal veröffentlichen, damit der Servicebus den Rest erledigen kann

WCF verfügt über MSMQ-Bindungen

Wenn Sie sich jedoch hauptsächlich an WCF halten müssen (kurze Zeiträume, andere WCF-Funktionen), empfehle ich Ihnen, diesen Artikel bei MSDN zu lesen. Sie erfahren, wie Sie die WCF-Bindungen für MSMQ verwenden und anschließend einen Dienst von HTTP nach MSMQ migrieren. Auf dem Weg dorthin werden einige Probleme mit diesem Szenario (und nützliche Lösungen für diese Probleme) gezeigt.

In beiden Vorschlägen wird MSMQ in großem Umfang verwendet. Beachten Sie Folgendes: Im Gegensatz zu Apache MQ, RabbitMQ und anderen gängigen Warteschlangensystemen ist MSMQ keine typische brokerbasierte Warteschlangenarchitektur, sondern eine verteilte Warteschlange. Dies bedeutet, dass wenn Ihr WCF-Client eine Nachricht über einen MSMQ-Transport sendet, während keine Verbindung zu dem Remoteserver hergestellt werden kann, der die Warteschlange hostet, der Clientcomputer die Nachricht stattdessen lokal in eine Warteschlange einreiht, die als "ausgehende Warteschlange" bezeichnet wird. Die Nachricht bleibt dort sicher, bis der MSMQ-Dienst des Clients erkennt, dass er erneut eine Verbindung zum Remote-MSMQ-Dienst herstellen kann. An diesem Punkt fließt die Nachricht vom Client zum Endziel.

Es gibt mindestens eine Einschränkung: Wenn der Remoteserver zu lange offline ist (überprüfen Sie Ihre Dokumentation auf MSMQ), gibt der Client auf und verschiebt die Nachricht vom Postausgang in die Warteschlange für nicht zustellbare Nachrichten. In die Warteschlange für nicht zustellbare Nachrichten übertragene Nachrichten können nicht automatisch erneut gesendet werden, sondern müssen neu erstellt werden.

Wenn Sie eine Verschlüsselung benötigen und kein Active Directory haben, führt Sergey Sorokin in diesem Blogeintrag die Schritte auf, die zum Verschlüsseln der Kommunikation von MSMQ mit WCF ohne Active Directory erforderlich sind.

Kyle Hodgson
quelle
7

Sie sind keine 1: 1-Ersetzung - häufig verwenden Sie NServiceBus, um Nachrichten in einen WCF-Endpunkt einzugeben oder von diesem zu empfangen.

In solchen Szenarien im getrennten Modus leuchten die Nachrichtenwarteschlangen auf jeden Fall wirklich. NServiceBus ist ein guter Anfang. Es gibt eine Reihe anderer Optionen. Ich stelle fest, dass viele von ihnen MSMQ am Ende des Tages tatsächlich einbinden - MSMQ ist ein sehr solides Back-End und es lohnt sich wahrscheinlich, es zu verwenden, wenn es zugänglich gemacht wird.

Wyatt Barnett
quelle
Vielen Dank. Punkt genommen, obwohl ich als 1: 1-Ersatz in meinem Fall sehe, weil die meisten meiner WCF-Kommunikationen dazu da sind, Kommunikationen zwischen diesen PCs und dem Server zu unterstützen - nsb scheint dies alles für mich zu erledigen, daher ist es ein Tausch -out für mich.
Matt Roberts
Gotcha, dann sollte es für dich ganz gut funktionieren.
Wyatt Barnett