【问题标题】:RabbitMQ heartbeat vs connection drain events timeoutRabbitMQ 心跳与连接耗尽事件超时
【发布时间】:2015-11-18 17:29:31
【问题描述】:


我有一个rabbitmq 服务器和一个使用kombu 的amqp 消费者(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

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

【问题讨论】:

    标签: python timeout rabbitmq heartbeat kombu


    【解决方案1】:

    它自己的 drain_events 不会产生任何心跳,除非有消息要消费和确认。如果队列处于空闲状态,那么最终连接将被关闭(通过 rabbit 服务器或您的防火墙)。

    您应该像这样同时使用心跳和超时:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2013-07-18
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-24
      • 1970-01-01
      相关资源
      最近更新 更多