2010-10-01 4 views
0

Si je configure un pipeline qui distribue la charge sur un cluster, je voudrais enregistrer où les messages sont envoyés. C'est ce que je pense (python):En utilisant zeromq dans un pipeline de chargement distribué, puis-je obtenir l'adresse du dernier serveur auquel un message a été envoyé?

import zmq 
context = zmq.Context() 
socket = context.socket(zmq.DOWNSTREAM) 
socket.connect("tcp://127.0.0.1:5000") 
socket.connect("tcp://127.0.0.1:6000") 

msg = "Hello World\0" 
connection_string = socket.send(msg) 
# should print "Sent message to tcp://127.0.0.1:5000" 
print "Sent message to", connection_string 

Mais je ne peux pas trouver tout ce qui parle à ce sujet. Chaque aide sera apprécié dans tous les cas.

Répondre

0

Il pense que vous voudrez utiliser les sockets X (REP | REQ) quelque part dans la topologie pour cela. Vous voudrez peut-être à la caisse du dispositif de file d'attente monitered: http://github.com/zeromq/pyzmq/blob/master/zmq/devices.pyx

Et pour plus d'informations générales ont un regard sur le diagramme et les explications des motifs ici aussi: http://ipython.scipy.org/doc/nightly/html/development/parallel_connections.html

Notez également que le type de prise AVAL est maintenant appelé PUSH (et l'AMONT correspondant a été changé en PULL).

0

Peut-être que vous pourriez inclure l'adresse du destinataire dans la réponse et l'enregistrer ensuite?

+1

Seulement pour certains modèles de message (par exemple REQ/REP). Pour PUSH/PULL il n'y a pas de réponse. – DNA

0

Mes 0,02 cents ...

Eh bien je crois que depuis les routes ZMQ de manière juste la file d'attente, ce serait tournoi à la ronde. Par conséquent, les messages seraient envoyés aux destinataires dans l'ordre. Cependant, écrire du code sous cette hypothèse ne serait pas la bonne chose puisque la logique de routage sous-jacente pourrait changer dans les futures versions. Pour PUSH/PULL, je ne suis pas sûr, mais pour REQ/REP, je suppose que le côté REP peut renvoyer la réponse dans un envolope avec le premier champ comme son adresse. De cette façon, le REQ peut lire deux fois sur le socket et obtenir l'adresse du répondeur ainsi que les données.

Questions connexes