【问题标题】:Setting up Rabbit MQ Heartbeat with Kombu使用 Kombu 设置 Rabbit MQ 心跳
【发布时间】:2013-01-29 11:36:33
【问题描述】:

编辑:

主要问题是第 3 方 rabbitmq 机器似乎不时地杀死空闲连接。那是我开始收到“Broken Pipe”异常的时候。获得通讯的唯一途径。恢复正常是让我终止进程并重新启动它们。我想有更好的方法吗?

--

我有点迷路了。我正在连接到第 3 方 RabbitMQ 服务器以将消息推送到。时不时地,他们机器上的所有套接字都被丢弃,我最终得到一个“Broken Pipe”异常。

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

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

我正在使用:

  • 芹菜==3.0.12
  • kombu==2.5.4

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

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

感谢所有帮助。

【问题讨论】:

    标签: python rabbitmq celery heartbeat kombu


    【解决方案1】:

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

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

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

    好消息是,将心跳添加到仅生产连接可能不会有太多好处。

    【讨论】:

    • 很公平 :) 那么处理我不时遇到的“Broken Pipe”异常的最佳方法是什么?有没有办法检查连接,如果它关闭,重新连接?再次感谢。
    • 我认为另一个线程中的这个答案可能会给你一些提示? groups.google.com/forum/?fromgroups=#!topic/carrot-users/…
    • 这看起来像我需要的。对代码进行了更改,如果它解决了我的连接问题,请告诉您:)
    • 太棒了,它似乎正在工作。自从实施我的 Producer 以来,没有再遇到任何“Broken Pipe”异常,如 Google Group 中所示。谢谢@asksol。
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2018-07-30
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2023-01-31
    • 2014-05-31
    • 2021-01-23
    相关资源
    最近更新 更多