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.