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 ...