2013-04-05 2 views
0

J'expérimente avec un simple modèle d'acteur dans haskell, où chaque acteur:Comment créer un socket "unique" dans zeromq?

  • est un fil haskell
  • a une prise PULL ZeroMQ sur laquelle il reçoit des messages

Certains acteurs sont "bien connus", ont des durées de vie indéfinies, et ont donc leur socket lié à un port bien connu. Les autres acteurs sont de courte durée et transitoires, et nécessitent donc un port libre aléatoire qui leur est affecté.

J'étais pas au courant de la capacité de zmq3 à permettre la liaison à un port éphémère, comme décrit ici: http://api.zeromq.org/3-2:zmq-tcp

Par conséquent, pour les acteurs transitoires J'ai actuellement un code qui tente de se lier à un port libre dans une fourchette donnée. Cela fonctionne comme destiné, mais met en évidence un comportement zmq qui me cause problèmes: Si un acteur temporaire ferme son port et se termine, et un nouvel acteur transitoire commence, il est susceptible de se lier au même port de l'ancien . Dans ce cas, tous les messages subséquents ou placés en file d'attente pour l'ancien acteur seront reçus par le nouveau .

Comment puis-je éviter cela?

Si je dois mes prises d'acteurs transitoires en utilisant le caractère générique pour obtenir un système affecté port éphémère, ce que je vois encore potentiellement ce problème?

Comment puis-je générer un nouveau socket PULL unique avec le transport TCP qui est garanti distinct des autres?

Répondre

0

En général, vous utilisez bind() uniquement pour les acteurs stables et «bien connus», et vous utilisez connect() pour les acteurs temporaires. Cela semble un peu bizarre si vous avez besoin du numéro de port pour les acteurs transitoires. En outre, vous devriez peut-être ajouter quelque chose à votre protocole afin que les acteurs transitoires qui s'en vont le sachent, afin que l'autre camp ne continue pas à leur envoyer des messages (qui sont ensuite reçus par un nouveau transitoire). acteur lié au même port que l'ancien).

Je pense que les ports éphémères assignés par le système essaient généralement de ne pas réutiliser les ports immédiatement, ce qui résoudrait probablement aussi certains de vos problèmes.

+0

_En usage général, vous utilisez bind() uniquement pour stable, « bien connu » acteurs et que vous utilisez connect() pour actors_ transitoire Un acteur transitoire doit encore fournir une adresse à laquelle d'autres acteurs peuvent envoyer des messages . Il ne sait pas qui ils seront, donc n'a rien à "connecter" avec. Je suppose que ce que je dis est que je m'attends à connecter() aux choses à que j'envoie des messages. Cela peut être des acteurs «bien connus» aux transitoires, ou vice versa. – timbod

+0

Votre architecture me semble encore bizarre. Si d'autres acteurs ont besoin de connaître l'adresse de l'acteur de passage, vous devez transmettre cette adresse aux autres acteurs.Soit ces autres acteurs ont une adresse stable, donc vous pouvez leur envoyer la nouvelle adresse via ZeroMQ (dans ce cas, vous n'avez pas besoin de leur envoyer l'adresse puisque vous pouvez établir la connexion du côté de l'acteur transitoire) ou vous avez un connexion hors bande (dans ce cas, pourquoi utiliser ZeroMQ?). Rappelez-vous que PUSH vs PULL et connect vs bind sont orthogonaux dans ZeroMQ. – djc

+0

Cela ne me semble pas bizarre :-) Vous n'avez pas besoin d'une connexion hors bande . Considérez ce scénario: les acteurs transitoires s'exécuteraient sur les PC des utilisateurs, en démarrant et s'arrêtant selon les besoins - s'ils se lient à une adresse , ils ont besoin de ports éphémères. Ils se découvriraient via un service de localisation bien connu, mais se connecteraient directement. Ainsi, pour chaque paire de processus transitoires devant communiquer, un côté doit se lier à une adresse. – timbod

Questions connexes