Question

Je développe un modèle de commande maître-esclave par lequel une application « Master » envoie des commandes à des processus homogènes appelés « esclave » pour faire une tâche et répondre ensuite en arrière avec l'état échec complet ou d'un processus. ils devraient également exposer des données au maître sont disponibles sur demande.

Qu'est-ce que ce modèle ressemble à WCF?

Maître et serait chaque instance d'hôte esclave thier propres services? serait seul hôte maître? seulement esclave? Dois-je utiliser des contrats de rappel? Contrats de données? ou tout simplement des contrats de service.

Comme une note de côté, c'est une faible bande passante, de faible intensité, projet de distribution interne uniquement utilisé pour les essais de produits et ne devrait pas être considéré comme un projet « grande forte demande ».

Était-ce utile?

La solution

Vous aurez certainement des contrats de services - un must - sous une forme ou sous forme. Ce juste définit votre service et les opérations (méthodes) sur elle (OperationContract).

Si c'est un système interne « derrière le pare-feu », vous pouvez regarder un duplex de liaison, par exemple que l'appel maître de l'esclave, et le rapport esclave retour sur un canal duplex quand il est fait. Hors de la boîte, il n'y a que le WSDualHttpBinding pour soutenir duplex, mais puisque vous êtes interne, derrière le pare-feu, vous voudrez peut-être regarder la création de votre propre liaison de duplex à base de TCP (il est pas aussi difficile que cela puisse paraître à d'abord!).

Dans ce scénario, les applications concernées sont vraiment serveur et le client en même temps.

Vous aurez DataContracts en quelque sorte, ou de forme pour définir les données qui est déplacé autour entre maître et esclave -. Encore une fois, oui, vous devez avoir des contrats de données

EDIT: Bien sûr, une autre approche pourrait consister à utiliser deux files d'attente de messages MSMQ; le maître laisse tomber sa demande « d'emploi » dans une file d'attente, que l'esclave écoute sur et ramasse la demande d'emploi. Lorsque l'esclave se fait, à son tour laisse tomber une réponse dans la file d'attente de réponse à laquelle le Maître est un auditeur, et est notifié du travail se fait de cette façon.

Marc

Autres conseils

Je suis d'accord avec Jeremy ici .. Qu'est-ce que vous décrivez n'a pas besoin de la complexité des contrats de rappel. Les nœuds de travailleurs pourraient simplement exposer un service WCF (ou même un service Web WSDL ou REST pour cette matière ...), puis le contrôleur aurait simplement besoin de connaître les URL de chacun des nœuds enfants et d'envoyer des messages aux nœuds des travailleurs.

Si vous voulez que le contrôleur soit en mesure de diffuser un message unique et ont tous le travailleur (je déteste vraiment l'analogie maître / esclave ... il y a longtemps que je l'appeler passé à contrôleur / travailleur) nœuds faire quelque chose en réponse et après leur progression au groupe, alors vous pouvez utiliser le canal P2P souvent sous-estimés disponibles dans WCF. Cela permet à un groupe de services écrits dans WCF de parler les uns aux autres à la fois en tant que pairs avec les URL utilisées presque comme séparateurs sujet / conversation.

Ainsi, par exemple, vous pouvez émettre des commandes sur le net.p2p: // laboratoires / commandes canal . Seul le contrôleur envoie des commandes sur ce canal, mais tous les nœuds de travailleurs écouter. Quand ils fait faire leur chose de manière asynchrone, ils peuvent rendre compte des progrès de retour sur la net.p2p: // laboratoires / état canal. Un autre avantage de cette approche est que (si vous avez besoin de cette fonction), les travailleurs individuels gagneraient la capacité de savoir ce que tous les autres travailleurs sont en train de faire.

Gardez à l'esprit cependant que si vous utilisez P2P, vous devrez faire face à contention - vous pouvez vous retrouver avec 2 nœuds acceptant la même commande. Si cela est bien, alors P2P est votre outil. Si vous avez besoin des commandes à émettre et seulement repris en série par des nœuds individuels qu'ils deviennent libres (un scénario plus probable lorsque dire noeuds distants afin d'exécuter des scripts de test individuels, etc.), vous pouvez utiliser une liaison de MSMQ au lieu de P2P. Ensuite, tous les travailleurs deviennent des clients qui reçoivent des messages de la file d'attente et vous pouvez contrer plus facilement la situation des travailleurs multiples acceptant la même demande.

Pour référence supplémentaire: Un blog j'ai écrit un certain temps sur la chaîne par les pairs.

Scénarios de canaux pairs sur MSDN - ce qui est bon parce que vous peut aller d'ici à Peer concepts anglo-normandes au guide de référence.

équipe chaîne Peer Blog

Si le traitement esclave prendra beaucoup de temps, alors les contrats de rappel pourrait être dans l'ordre. Sinon, vous pouvez simplement bloquer dans le Master en attendant l'esclave pour compléter (vous devrez peut-être modifier la configuration de votre client WCF afin qu'il ne chronométrer pas).

D'après votre description, je pense que vous auriez vraiment besoin d'accueillir le service WCF sur les nœuds esclaves et le Maître pourrait juste être un client consommant les services WCF exposés par les esclaves.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top