RabbitMQ心跳与连接排除事件超时

Mr *_* T. 7 python timeout heartbeat rabbitmq kombu


我有一个rabbitmq服务器和一个使用kombu的am​​qp使用者(python).
我已将我的应用程序安装在具有防火墙的系统中,该防火墙在1小时后关闭空闲连接.
这是我的amqp_consumer.py:

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
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果防火墙关闭了连接,那么我想重新连接.我应该使用heartbeat参数还是应该将超时参数(3600秒)传递给drain_events()函数?
两种选择有什么区别?(似乎做同样的事).
谢谢.

ode*_*fos 1

Drain_events 本身不会产生任何心跳,除非有消息要使用和确认。如果队列空闲,那么最终连接将被关闭(通过兔子服务器或防火墙)。

你应该做的是同时使用心跳和超时,如下所示:

while True:
    try:
        conn.drain_events(timeout=1)
    except socket.timeout:
        conn.heartbeat_check()
Run Code Online (Sandbox Code Playgroud)

这样,即使队列空闲,连接也不会关闭。

除此之外,您可能希望使用重试策略来包装整个过程,以防连接关闭或出现其他网络错误。