Question

Je construis un pipeline de traitement avec NServiceBus mais je vais avoir des problèmes avec la configuration des distributeurs afin de faire chaque étape dans le processus évolutif de. Voici quelques informations:

  • Le pipeline aura un processus maître qui dit: « OK, le temps de commencer » pour un WorkItem, qui commencera alors un processus comme un organigramme.
  • Chaque étape dans l'organigramme peut être coûteux informatiquement, donc je veux la capacité à l'échelle chaque étape. Cela me dit que chaque étape a besoin d'un distributeur.
  • Je veux être en mesure d'accrocher des activités supplémentaires sur les événements ultérieurs. Cela me dit que je dois publier () messages quand il est fait, pas envoyer () les.
  • processus A peut être nécessaire de branche en fonction d'une condition. Cela me dit qu'un processus doit être en mesure de publier plus d'un type de message.
  • processus A peut se joindre à fourches besoin. J'imagine que je devrais utiliser Sagas pour cela.

Espérons que ces hypothèses sont bonnes, sinon je suis en plus de mal que je pensais.

Par souci de simplicité, nous allons oublier bifurquer ou de se joindre et d'envisager un pipeline simple, à l'étape A suivie de l'étape B, et se terminant par l'étape C. Chaque étape obtient son propre distributeur et peut avoir de nombreux messages de traitement des noeuds.

  • travailleurs NODEA contiennent un processeur IHandleMessages et publier EVENTA
  • travailleurs NodeB contiennent un processeur IHandleMessages et publier l'événement B
  • travailleurs NoDec contiennent un processeur IHandleMessages, puis le pipeline est terminée.

Voici les parties pertinentes des fichiers de configuration, où # représente le nombre du travailleur, (par exemple il y a des files d'attente d'entrée NodeA.1 et NodeA.2):

NodeA:
<MsmqTransportConfig InputQueue="NodeA.#" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
<UnicastBusConfig DistributorControlAddress="NodeA.Distrib.Control" DistributorDataAddress="NodeA.Distrib.Data" >
    <MessageEndpointMappings>
    </MessageEndpointMappings>
</UnicastBusConfig>

NodeB:
<MsmqTransportConfig InputQueue="NodeB.#" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
<UnicastBusConfig DistributorControlAddress="NodeB.Distrib.Control" DistributorDataAddress="NodeB.Distrib.Data" >
    <MessageEndpointMappings>
        <add Messages="Messages.EventA, Messages" Endpoint="NodeA.Distrib.Data" />
    </MessageEndpointMappings>
</UnicastBusConfig>

NodeC:
<MsmqTransportConfig InputQueue="NodeC.#" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
<UnicastBusConfig DistributorControlAddress="NodeC.Distrib.Control" DistributorDataAddress="NodeC.Distrib.Data" >
    <MessageEndpointMappings>
        <add Messages="Messages.EventB, Messages" Endpoint="NodeB.Distrib.Data" />
    </MessageEndpointMappings>
</UnicastBusConfig>

Et voici les parties pertinentes du distributeur configs:

Distributor A:
<add key="DataInputQueue" value="NodeA.Distrib.Data"/>
<add key="ControlInputQueue" value="NodeA.Distrib.Control"/>
<add key="StorageQueue" value="NodeA.Distrib.Storage"/>

Distributor B:
<add key="DataInputQueue" value="NodeB.Distrib.Data"/>
<add key="ControlInputQueue" value="NodeB.Distrib.Control"/>
<add key="StorageQueue" value="NodeB.Distrib.Storage"/>

Distributor C:
<add key="DataInputQueue" value="NodeC.Distrib.Data"/>
<add key="ControlInputQueue" value="NodeC.Distrib.Control"/>
<add key="StorageQueue" value="NodeC.Distrib.Storage"/>

Je teste avec 2 instances de chaque noeud, et le problème semble venir au milieu au nœud B. Il y a essentiellement 2 choses qui pourraient se produire:

  1. Les deux instances de rapport Node B qu'il est vous abonnant à EVENTA, et que NodeC.Distrib.Data@MYCOMPUTER est souscrit au EventB ce nœud B publie. Dans ce cas, tout fonctionne très bien.
  2. Les deux instances de rapport Node B qu'il est vous abonnant à EVENTA, cependant, un travailleur dit NodeC.Distrib.Data@MYCOMPUTER est abonnée DEUX FOIS, tandis que l'autre travailleur ne mentionne pas.

Dans le second cas, ce qui semble être contrôlée que par la façon dont les voies de distribution des messages d'abonnement, si le nœud « overachiever » traite un EVENTA, tout va bien. Si le « Underachiever » traite EVENTA, la publication de EventB n'a pas d'abonnés et les matrices de flux de travail.

Alors, mes questions:

  1. Est-ce type de configuration possible?
  2. La configuration est correcte? Il est difficile de trouver des exemples de configuration avec des distributeurs au-delà d'un simple éditeur / configuration 2-travailleur un niveau.
  3. Ne serait-il plus judicieux d'avoir un processus de courtier central qui fait toutes les opérations de flic de la circulation non informatiquement à forte intensité, et envoie uniquement des messages aux processus sous-jacents distributeurs lorsque la tâche est de longue durée et doit être un équilibrage de charge?
    • Ensuite, les nœuds de charge équilibrée pourrait simplement répondre de retour au courtier central, qui semble plus facile.
    • D'autre part, qui semble en contradiction avec la décentralisation qui est la force de NServiceBus.
    • Et si cela est la réponse, et la longue manifestation de processus en cours d'exécution done est une réponse, comment voulez-vous garder la Publish qui permet par la suite des événements d'extensibilité publiés?
Était-ce utile?

La solution

Le problème que vous avez est que vos nœuds ne se voient pas d'autres la liste des abonnés. La raison pour laquelle vous éprouvez ce problème est que vous essayez un scénario de production (échelle) dans le cadre du défaut profil NServiceBus (lite) qui ne supporte pas scale-out, mais rend le développement d'une seule machine très productive.

Pour résoudre le problème, exécutez l'hôte NServiceBus en utilisant le profil de production comme décrit sur cette page:

http://docs.particular.net/nservicebus/hosting/nservicebus -host / profils

Cela permettra aux différents noeuds partagent la même liste d'abonnés.

Autre que cela, la configuration est à droite sur.

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