2011-04-23 12 views
6

Estoy intentando configurar PUB/SUB "invertido" con ZeroMQ.Problemas con PUB/SUB invertido con ZeroMQ

Lo que significa que los sockets de suscripción (SUB) pertenecen a varios servidores de larga duración, haciendo zmq_bind(); y el conector de publicación (PUB) es un cliente efímero y lo hace en zmq_connect().

Uso un solo socket ipc://.

Espero que un mensaje del editor llegue a cada uno de los suscriptores.

El problema: solo uno de los procesos de suscriptor recibe mensajes. Si ese proceso muere, el editor se queda atascado en zmq_term().

¿Este modo de operaciones es compatible con zmq? Si es así, ¿qué estoy haciendo mal? Si no, ¿cómo implementar lo que necesito?

ejemplo mínimo con algunos detalles adicionales (en Lua, pero esto no debe importar): https://gist.github.com/938429

Respuesta

6

No se puede obligar a enchufes múltiples, uno ipc:// electrónico (estamos hablando de Dominio Unix zócalo aquí ipc: // /tmp/test.ipc == file /tmp/test.ipc).

Lo que puede hacer es vincular cada socket SUB a una dirección ipc: // diferente y hacer que el editor conecte un socket PUB a cada una de esas direcciones. ZeroMQ permite un socket para enlazar/conectarse a múltiples direcciones.

Es muy probable que el bloqueo en zmq_term() persista en un problema cercano (es decir, hay un mensaje que el socket PUB está intentando enviar). Eche un vistazo a la opción de socket ZMQ_LINGER.

+0

Sí, cada enlace simplemente anula el archivo. Debería haberlo descifrado, lo siento por el ruido. –

+0

No eres la primera persona en ser golpeada por esto; es bastante inconsistente con otros transportes y por lo tanto no es obvio ... ha habido discusión en la lista sobre cómo cambiar esto. –

2

No puede enlazar múltiples sockets a la misma dirección en una máquina, ya sea ipc o tcp, SUB/PUB o REQ/REP. Es como el enlace de un socket de red.

La forma de enviar mensajes a todos los suscriptores de muchos editores, es implementar un intermediario simple, que se una a una dirección SUB y una dirección PUB. Los editores se conectan al zócalo SUB para enviar mensajes y los suscriptores se conectan al zócalo PUB del mismo broker, y el bróker simplemente reenvía todos los mensajes recibidos desde el zócalo SUB al zócalo PUB. Se necesita una sobrecarga de rendimiento, pero es bastante fácil de programar.

En ZeroMQ 2.0 hay un ejecutable zmq_forwarder que puede usarse solo para este propósito, en 2.1 se refiere a la función zmq_device (3).

+0

Si entiendo esto correctamente, ese proceso de intermediario será un único punto de falla.Hay alguna manera de evitar esto? –

+0

Creo que sí. Pero dado que todos sus programas se ejecutan en una sola computadora (con ipc: // socket), el hardware y las fallas de la red no serán el problema. El proceso del agente puede ser demasiado simple para fallar. Sin embargo, si involucra muchos nodos, no estoy seguro de si esta es la mejor manera. –

+0

Siempre hay un mono de Caos, incluso en una sola máquina. (Es una broma :-)) –

4

Hay una 'característica' del transporte ipc: // que es que si dos procesos se unen al mismo punto final IPC, el segundo roba silenciosamente el enlace del primero. Esta 'característica' se creó para permitir que los procesos se recuperen fácilmente después de un bloqueo.

Es por eso que solo un suscriptor recibe los mensajes.

Dado que solo tiene un editor, ¿por qué no vincular al editor y conectar a los suscriptores a eso? Incluso si el editor aparece y se va, los suscriptores se volverán a conectar automáticamente.