2015-09-08 21 views
6

Sto scrivendo uno script che riceve richieste HTTP (usando Tornado), le analizza e le invia a un broker RabbitMQ usando pika.Connessione Pika chiusa dopo 3 heartbeat

Il codice simile a questo:

def main(): 
    conn_params = pika.ConnectionParameters(
     host=BROKER_NAME, 
     port=BROKER_PORT, 
     ssl=True, 
     virtual_host=VIRTUAL_HOST, 
     credentials=pika.PlainCredentials(BROKER_USER, BROKER_PASS), 
     heartbeat_interval=HEARTBEAT_INTERVAL 
    ) 
    conn = pika.BlockingConnection(conn_params) 
    channel = conn.channel() 

    # Create the web server which handles application requests. 
    application = tornado.web.Application([ 
     (URL_BILLING, SomeHandler, dict(channel=channel)) 
    ]) 

    # Start the server 
    application.listen(LISTENING_PORT) 
    tornado.ioloop.IOLoop.instance().start() 

Come potete vedere, apro una singola connessione e del canale, e passare il canale a qualsiasi istanza del gestore che si crea, con l'idea di salvare il traffico ed evitare di aprire una nuova connessione/canale per ogni richiesta.

Il problema riscontrato è che la connessione viene chiusa dopo 3 heartbeat. Ho usato Wireshark per capire qual è il problema, ma tutto quello che posso vedere è che il server invia un PSH (presumo che questo sia l'heartbeat) e i miei script rispondono con un ACK. Ciò accade 3 volte con HEARTBEAT_INTERVAL tra loro, e quindi il server invia semplicemente un FIN e la connessione muore.

Qualche idea del motivo? Inoltre, dovrei tenere aperta la connessione o è meglio crearne una nuova per ogni messaggio che devo inviare?

Grazie per l'aiuto.

UPDATE: Ho guardato nel registro RabbitMQ, e dice: Missed heartbeats from client, timeout: 10s ho pensato che il server è stato pensato per trasmettere i battiti cardiaci al cliente, per assicurarsi che risponde, e questo è d'accordo con quello che ho osservato con Wireshark , ma da questo registro sembra che sia il client che deve riferire al server, non viceversa, e il client, evidentemente, non segnala. Sto ottenendo questo giusto?

UPDATE: Capito, una specie di. Una connessione di blocco (che è quello che ho usato) non è in grado di inviare heartbeat perché è, beh, il blocco. Come menzionato in this issue, i parametri heartbeat_interval vengono utilizzati solo per negoziare la connessione con il server, ma il client non invia effettivamente heartbeat. Dal momento che questo è il caso, qual è il modo migliore per mantenere una connessione a lungo termine con Pika? Anche se non specifico heartbeat_interval, il server di default per un battito cardiaco ogni 10 minuti, in modo che il collegamento morirà dopo 30 minuti ...

risposta

Problemi correlati