Dois-je passer de WCF à NserviceBus

13

Nous avons un serveur central qui envoie et reçoit des messages d'un certain nombre de PC situés sur des réseaux clients à différents endroits. Pour faciliter cela, j'utilise actuellement WCF avec TCPNetBindings, en utilisant une communication duplex sécurisée avec des certificats.

Maintenant, nous avons un certain nombre de problèmes avec cela - principalement qu'on nous demande de prendre en charge le "mode déconnecté" (nous devons être tolérants aux pannes). D'après ce que je sais, il n'y a pas de moyen simple de le faire en utilisant la pile WCF - nous aurions besoin d'implémenter quelque chose et peut-être d'utiliser msmq. J'ai récemment regardé NServiceBus, et d'après ce que je peux voir, cela semble bien convenir - tolérance aux pannes, les messages peuvent être envoyés sur Internet via une simple passerelle http, etc. Je sais qu'il est bien respecté dans la communauté, et Je peux voir pourquoi en y regardant.

Donc, ma question est ... L'emploi de NServiceBus semble-t-il une idée sensée, ou quelqu'un a-t-il d'autres suggestions / une expérience du monde réel qui s'y rapportent? Je suppose que je suis inquiet d'introduire une nouvelle technologie que je connais relativement peu et de faire face à des problèmes tels que la sécuriser, tout configurer de manière fiable, se tromper en cours de route .. Je me méfie également de "l'or- plaquant "l'architecture, et choisissant quelque chose de brillant qui finira par m'embourber dans l'implémentation par rapport à s'en tenir à WCF et à le faire fonctionner pour moi ..

Merci!

Matt Roberts
la source
1
> prendre en charge le "mode déconnecté" (nous devons être tolérants aux pannes) N'allez-vous pas encore devoir construire vous-même une grande partie de la tolérance aux pannes côté client? La tolérance aux pannes de MSMQ sur le serveur est idéale pour restaurer l'état en cas de problème, mais je vois toujours qu'être un gros mal de tête pour le client, peu importe ce que vous avez choisi.
brian
1
Eh bien, ce que je dois soutenir, c'est la "garantie" que le client enverra un message au serveur et que le serveur l'aura finalement - donc si nous sommes hors ligne, nous devons continuer d'essayer jusqu'à ce que nous y arrivions. C'est ce que NSB fait "gratuitement", alors qu'en tant que solution WCF (je pense), il faudrait du code ..
Matt Roberts
Je suis partiellement d'accord avec Brian. MSMQ, s'il est correctement configuré dans les versions récentes, vous offre un assez bon mode déconnecté dès que vous configurez la file d'attente et le message pour se comporter de cette façon. Le client peut conserver les messages dans la file d'attente sortante locale et les renvoyer lorsque le serveur est à nouveau disponible sur une file d'attente distante.
Bill
WCF a des liaisons MSMQ ... Je connais intimement plusieurs applications réussies à grande échelle qui en font usage. Cela dit, j'aime aussi nServiceBus, mais cela fait une chose différente.
Kyle Hodgson

Réponses:

12

Ma suggestion, si vous avez besoin d'être rapide à ce sujet et que vous n'avez besoin que de quelque chose de simple pour faciliter un fonctionnement durable (déconnecté) avec WCF, est de regarder dans les liaisons WCF - MSMQ. Si vous avez besoin de quelque chose dans un environnement plus large, regardez nServiceBus.

Dans mon esprit, nServiceBus commencerait vraiment à briller dans un environnement distribué plus large. Prenons, par exemple, l'exemple suivant (ce serait l'enfer sur terre avec WCF mais simple avec nServiceBus):

  • Infrastructure composée du niveau serveur d'applications, du niveau serveur cache, du niveau base de données en lecture seule, du niveau base de données en lecture / écriture
  • Chaque fois que le client soumet une nouvelle entrée, vous aimeriez vraiment que tous ces niveaux soient mis à jour en même temps
  • Dans WCF, vous devez exposer des services distincts à chaque niveau et demander au client de les envoyer à tous (ou avoir une orchestration centrale faisant la même chose pour vous)
  • Dans nServiceBus, chaque niveau serait abonné à ces informations et le client les publierait une fois, permettant au bus de service de s'occuper du reste.

WCF a des liaisons MSMQ

Cependant, si vous devez principalement rester avec WCF (délais courts, besoin d'autres fonctionnalités WCF), je vous suggère de consulter cet article sur MSDN. Il vous montre comment utiliser les liaisons WCF pour MSMQ, puis vous montre comment migrer un service de HTTP vers MSMQ. En cours de route, il vous montre certains des problèmes de ce scénario (et des solutions utiles à ces problèmes).

Ces deux suggestions font un usage intensif de MSMQ, donc une note à ce sujet: contrairement à Apache MQ, RabbitMQ et à d'autres systèmes de files d'attente populaires, MSMQ n'est pas une architecture de file d'attente basée sur un courtier typique, c'est plutôt une file d'attente distribuée. Cela signifie que si votre client WCF envoie un message via un transport MSMQ alors qu'il ne peut pas se connecter au serveur distant qui héberge la file d'attente, la machine cliente mettra en file d'attente le message dans ce qui est appelé une «file d'attente sortante» localement à la place. Le message y restera en sécurité jusqu'à ce que le service MSMQ du client détecte qu'il peut se reconnecter au service MSMQ distant. À ce stade, le message circulera du client vers la destination finale.

Il y a au moins une mise en garde à ce qui précède - si le serveur distant est hors ligne pendant trop longtemps (consultez votre documentation pour MSMQ), le client abandonnera et déplacera le message de sortant vers la file d'attente de lettres mortes. Les messages transférés dans la file d'attente de lettres mortes ne peuvent pas être renvoyés automatiquement, ils doivent être reconstruits.

Si vous avez besoin d'un chiffrement et que vous n'avez pas ActiveDirectory, sur cette entrée de blog , Sergey Sorokin détaille les étapes nécessaires pour chiffrer la communication de MSMQ à l'aide de WCF sans Active Directory.

Kyle Hodgson
la source
7

Ils ne sont pas un remplacement 1 pour 1 - plusieurs fois, vous utiliserez NServiceBus pour alimenter ou prendre des messages à partir d'un point de terminaison WCF.

Dans tous les cas, la gestion de scénarios en mode déconnecté comme celui-ci est vraiment très intéressante. NServiceBus est un bon point de départ. Il existe un certain nombre d'autres options. Je noterai que beaucoup d'entre eux enveloppent MSMQ à la fin de la journée - MSMQ est un back-end très solide et vaut probablement la peine d'être utilisé lorsqu'il est rendu accessible.

Wyatt Barnett
la source
Merci. Point pris, bien que je considère comme un remplacement 1: 1 dans mon cas, car la plupart de mes communications WCF sont là pour prendre en charge les communications entre ces ordinateurs et le serveur - nsb semble s'occuper de tout cela pour moi, c'est donc un échange -pour moi.
Matt Roberts
Gotcha, alors cela devrait fonctionner assez bien pour vous.
Wyatt Barnett