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?
_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
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
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