2011-11-30 10 views
6

Tengo una configuración simple de pub-sub en una red de tamaño medio, usando ZMQ 2.1. Aunque algunos suscriptores están utilizando enlaces C#, otros usan enlaces de Python, y el problema que estoy teniendo es el mismo para ambos.ZMQ Pub-Sub Fallo de programa al perder conectividad de red

Si desconecto el cable de red de una máquina que ejecuta un suscriptor, aparece un error que no se puede capturar que termina inmediatamente con ese suscriptor.

Aquí hay un ejemplo muy simple de un abonado en Python (no código de producción real, pero lo suficiente para reproducir el problema):

import zmq 

def main(server_address, port): 

    context = zmq.Context() 
    sub_socket = context.socket(zmq.SUB) 
    sub_socket.connect("tcp://" + server_address + ":" + str(port)) 
    sub_socket.setsockopt(zmq.SUBSCRIBE, "KITH1S2") 

    while True: 

     msg = sub_socket.recv()  
     print msg 

if __name__ == "__main__": main("company-intranet", 4000) 

En C# el programa termina simplemente en silencio. En Python que al menos sale esto:

aserción: rc == 0 (.... \ src \ zmq_connector.cpp: 48)

Esta aplicación ha solicitado el tiempo de ejecución de terminarlo en una forma inusual Póngase en contacto con el equipo de soporte de la aplicación para obtener más información.

He intentado versiones sin bloqueo, y versiones de poller, pero en cualquier caso este problema de terminación instantánea persiste. ¿Hay algo obvio I que debería estar haciendo pero no? (Es decir, obvio para otra persona :)).

EDIT:

encontró lo siguiente: https://zeromq.jira.com/browse/LIBZMQ-207

Parece como si es/era un problema conocido.

que enlazan otros enlaces a Github, donde un registro de cambios de 2.1.10 tiene esta nota:

  • solucionado el problema 207, error de aserción en zmq_connecter.cpp: 48, cuando un zmq_connect inválida () cadena fue utilizada, o el nombre de host no pudo ser resuelto. La llamada zmq_connect() ahora devuelve -1 en ambos casos.

Aunque connect() en efecto, lanzar una excepción Argumento no válido en Python (no parecer C#?), recv() todavía falla. Si la máquina del suscriptor pierde de repente la red, ese suscriptor simplemente dejará de funcionar.

Así que - Voy a intentar usar las direcciones IP en lugar de las direcciones nombradas para ver si esto omitirá el problema. No es ideal, pero es mejor que insta-crash.

Respuesta

1

Pregunta original: ¿Hay algo obvio que debería estar haciendo pero no estoy?

La solución por ahora es utilizar el direccionamiento IP. Esto no causa fallas del programa al desconectar la red para ZMQ 2.1.x.