2012-03-26 4 views
6

Tengo un pequeño grupo de compañeros (por ejemplo, 10 nodos) que ya publican y suscriben mensajes. Esto está funcionando bien. El clúster es estático y cada nodo conoce la dirección de los otros nodos.¿Cuál es la mejor forma de enviar mensajes de no respuesta asincrónica entre pares con ØMQ?

En mi caso de uso, también necesito que todos los nodos puedan enviar mensajes a cualquier nodo específico, y todos los nodos deben escuchar los mensajes dirigidos a ellos. El nodo emisor no necesita una respuesta, no debería tener que esperar una respuesta y no necesita saber que el otro nodo ha recibido el mensaje.

¿Qué tipo de patrón y tipo de socket se pueden utilizar para implementar esto?

Soy bastante nuevo en ØMQ, y he buscado el Freelance Pattern de la guía, más específicamente Model Three - Complex and nasty. ¿Está utilizando el enfoque ROUTER-ROUTER descrito allí apropiado en mi caso?

Estoy pensando en permitir que cada nodo se vincule a un enrutador estableciendo su dirección como identidad (y "sondeándolo" en su ciclo de mensajes), y también permitiendo que el nodo envíe un enrutador, especificando la dirección del nodo receptor como identidad.

¿He perdido alguna forma más simple de hacer esto? Usar el enfoque anterior parece tal vez un poco complejo ya que realmente no necesito el procedimiento de handshake para que el receptor pueda enviar una respuesta.

Respuesta

2

Para enviar trabajo a un compañero sin necesidad de una respuesta, probablemente usaría un patrón de Fanout, que te permitirá "disparar y olvidarte" de forma más efectiva.

Enrutador y distribuidor están realmente allí para el nivel "dispositivo" en un patrón de solicitud/respuesta "extendido".

+0

Tal vez me está faltando algo aquí, pero ¿cómo me permite enviar un mensaje solo a un nodo específico? – tle

+2

Solo tendrías un nodo haciendo el PULL en lugar de una serie de nodos. En otras palabras, cuando necesita emplear el caso de uso de "nodo específico", tiene un solo par de PUSH y un solo PULL. No hay ninguna expectativa al hacer un PUSH de que recibas algo a cambio, así que en mi mente es una mejor metáfora asíncrona que REQ/REP. También podría hacer una PUB/SUB entre nodos individuales si solo quiere reutilizar lo que ya tiene, arquitectónicamente. – Shaun

+1

PUSH-PULL no soltará mensajes si el destinatario está caído, según el documento, lo que significa que si su nodo remoto falla (el interlocutor al que está enviando) y vuelve, recibirá un montón de mensajes antiguos. Por supuesto, puede mitigar este problema haciendo un seguimiento del estado de arriba hacia abajo del destinatario (mediante un latido del corazón, o equivalente), y cerrando el socket PUSh tan pronto como el nodo baje (con linger = 0 posiblemente). –

Cuestiones relacionadas