2011-11-30 6 views
6

Ho una semplice configurazione pub-sub su una rete di medie dimensioni, utilizzando ZMQ 2.1. Sebbene alcuni abbonati utilizzino i collegamenti C#, altri utilizzano i collegamenti Python e il problema che sto riscontrando è lo stesso per entrambi.ZMQ Pub-Sub Programma mancata quando si perde la connettività di rete

Se tiro il cavo di rete da una macchina che esegue un abbonato, ottengo un errore non-catturabile che termina subito che abbonato.

Ecco un esempio molto semplice di un abbonato in Python (non il codice di produzione vera e propria, ma abbastanza per riprodurre il 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) 

In C# il programma termina semplicemente in silenzio. In Python io almeno ottengo questo:

Asserzione non riuscita: rc == 0 (.... \ src \ zmq_connector.cpp: 48)

L'applicazione ha richiesto al runtime l'interruzione in un modo insolito. Per ulteriori informazioni, contattare il team di supporto dell'applicazione.

Ho provato versioni non bloccanti e versioni di poller, ma in entrambi i casi questo problema di terminazione istantanea persiste. C'è qualcosa di ovvio che io dovrei fare ma non lo sono? (Ovvio, ovvio per qualcun altro :)).

EDIT:

Trovato il seguente: https://zeromq.jira.com/browse/LIBZMQ-207

sembra come se si è/era un problema noto.

che puntano ulteriori collegamenti a Github, dove un registro delle modifiche per 2.1.10 ha questa nota:

  • Risolto il problema 207, errore di asserzione in zmq_connecter.cpp: 48, quando un valida zmq_connect () è stata utilizzata la stringa o il nome host non può essere risolto . La chiamata zmq_connect() ora restituisce -1 in entrambi i casi.

Anche se connect() effettivamente gettare un'eccezione Argomento non valido in Python (non C# a quanto pare?), recv() fallisce ancora. Se la macchina dell'abbonato perde improvvisamente la rete, l'abbonato semplicemente smetterà di funzionare.

Così - ho intenzione di provare a utilizzare gli indirizzi IP invece di indirizzi di nome per vedere se questo consentirà di bypassare il problema. Non ideale, ma meglio di insta-crash.

risposta

1

domanda originale: C'è qualcosa di ovvio che dovrei fare, ma io non sono?

No.

La soluzione per ora è quello di utilizzare l'indirizzamento IP. Ciò non causa l'errore del programma al momento della disconnessione dalla rete per ZMQ 2.1.x.

Problemi correlati