2011-10-21 4 views
0

J'ai besoin d'une application web PHP écrire des messages dans une file d'attente non bloquante et d'autres processus de les mettre en file d'attente. Ma conception actuelle est l'application PHP créer un ZMQ.PUSH socket, faire un connect à l'adresse de destination et send le message. Alors qu'à la destination, un processus (Java) crée un socket ZMQ.PULL, faites un bind sur la même adresse et receive le message. Cependant, lorsque le processus dequeuer est en panne (ou non démarré), les messages que l'application PHP a envoyés pendant cette période sont perdus (non remis au dequeuer lorsque le processus redémarre sur la même adresse). Est-ce un problème avec l'application PHP créant un nouveau ZMQ.Context à chaque fois?Modèle ZMQ PUSH/PULL: Messages perdus lorsqu'un noeud PUSHes messages et quitte

Par exemple, j'ai créé un autre processus Java pour écrire des messages dans la file d'attente.

public static void main(String[] args) { 
    ZMQ.Context context = ZMQ.context(1); 
    ZMQ.Socket socket = context.socket(ZMQ.PUSH); 
    socket.connect("tcp://localhost:5557"); 

    for(int i = 0; i < 10; i++) { 
     socket.send(("Sending : " + message).getBytes(), 0); 
    } 
} 

Cela a le même problème de messages perdus si le processus de dequeuing ne démarre pas au moment où les processus ci-dessus est terminé.

Mais l'ajout d'un while(true) {} à la fin du corps de la méthode ci-dessus n'entraîne aucun message perdu - tous les messages sont remis au démarrage de dequeuer. Est-ce que j'ai raison de supposer que l'objet ZMQ.Context étant collecté par ordures cause le problème ici? Si oui, alors comment résoudre ce problème dans une application web PHP? Puisque je ne peux pas persister l'objet ZMQ.Context.

Répondre

0

Vous recherchez ce que l'on appelle les messages durable.

Examinez le zmq_setsockopt en particulier l'option ZMQ_IDENTITY comme première étape de votre solution.

Assurez-vous de lire les sections dans le manuel au sujet de High-Water Marks afin de ne pas aller trop loin si le lecteur est hors ligne pendant un moment.

Bonne chance

Questions connexes