2015-11-18 9 views
7


Ich habe eine Rabbitmq-Server und eine AMQP-Consumer (Python) mit Kombu.
Ich habe meine App in einem System installiert, das eine Firewall hat, die inaktive Verbindungen nach 1 Stunde beendet. Dies ist
meine amqp_consumer.py:RabbitMQ Heartbeat vs Verbindung Drain-Ereignisse Timeout

try: 
    # connections 
    with Connection(self.broker_url, ssl=_ssl, heartbeat=self.heartbeat) as conn: 
     chan = conn.channel() 
     # more stuff here 
     with conn.Consumer(queue, callbacks = [messageHandler], channel = chan): 
     # Process messages and handle events on all channels 
     while True: 
      conn.drain_events() 

except Exception as e: 
    # do stuff 

, was ich will, ist, dass, wenn die Firewall die Verbindung geschlossen, dann möchte ich wieder an. Soll ich das Heartbeat-Argument verwenden oder sollte ich ein Timeout-Argument (von 3600 Sekunden) an die drain_events()-Funktion übergeben?
Was sind die Unterschiede zwischen den beiden Optionen? (scheint dasselbe zu tun).
Danke.

Antwort

0

Die eigenen drain_events würden keine Herzschläge erzeugen, außer wenn es Nachrichten zu konsumieren und zu bestätigen gibt. Wenn die Warteschlange im Leerlauf ist, wird die Verbindung schließlich geschlossen (vom Hasen-Server oder von Ihrer Firewall).

Was Sie tun sollten, ist sowohl den Herzschlag nutzen und das Timeout wie folgt:

while True: 
    try: 
     conn.drain_events(timeout=1) 
    except socket.timeout: 
     conn.heartbeat_check() 

Auf diese Weise, selbst wenn die Warteschlange im Leerlauf ist die Verbindung nicht geschlossen werden.

Darüber hinaus möchten Sie möglicherweise das ganze mit einer Wiederholungsrichtlinie umwickeln, falls die Verbindung geschlossen wird oder ein anderer Netzwerkfehler auftritt.