使用Kombu设置Rabbit MQ Heartbeat

时间:2013-01-29 11:36:34

标签: python rabbitmq celery heartbeat kombu

修改

主要问题是第三方rabbitmq机器似乎偶尔杀死空闲连接。那是我开始得到“破管”的例外情况。获得通信的唯一方法。恢复正常是我杀死进程并重新启动它们。我认为有更好的方法吗?

-

我在这里有点失落。我正在连接到第三方RabbitMQ服务器以将消息推送到。每隔一段时间,他们机器上的所有插座都会掉线,最后我会得到一个“破管”例外。

我被告知要在我的代码中实施心跳检查,但我不确定具体如何。我在这里找到了一些信息:http://kombu.readthedocs.org/en/latest/changelog.html#version-2-3-0但没有真正的示例代码。

我只需要在连接字符串中添加“?heartbeat = x”吗? Kombu做其余的吗?我看到我需要在“x / 2”处调用“Connection.heartbeat_check()”。我应该创建一个定期任务来调用它吗?如何重新建立连接?

我正在使用:

  • 芹菜== 3.0.12
  • 海带== 2.5.4

我的代码现在看起来像这样。调用一个简单的Celery任务将消息发送到第三方RabbitMQ服务器(删除日志记录和注释以保持简短,足够基本):

class SendMessageTask(Task):
    name = "campaign.backends.send"
    routing_key = "campaign.backends.send"
    ignore_result = True
    default_retry_delay = 60 # 1 minute.
    max_retries = 5

    def run(self, send_to, message, **kwargs):
    payload = "Testing message"

    try:
        conn = BrokerConnection(
        hostname=HOSTNAME,
        port=PORT,
        userid=USER_ID,
        password=PASSWORD,
        virtual_host=VHOST
        )

        with producers[conn].acquire(block=True) as producer:
        publish = conn.ensure(producer, producer.publish, errback=sending_errback, max_retries=3)
        publish(
            body=payload,
            routing_key=OUT_ROUTING_KEY,
            delivery_mode=2,
            exchange=EXCHANGE,
            serializer=None,
            content_type='text/xml',
            content_encoding = 'utf-8'
        )

    except Exception, ex:
        print ex

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

虽然您当然可以为生产者添加心跳支持,但对消费者流程更有意义。

启用心跳意味着您必须定期发送心跳,例如如果心跳设置为1秒,则必须每隔一秒或更长时间发送心跳,否则遥控器将关闭连接。

这意味着您必须使用单独的线程或使用async io及时可靠地发送心跳,并且由于无法在线程之间共享连接,因此我们会使用异步io。

好消息是,您可能无法获得将心跳添加到仅限生产连接的好处。