为RabbitMQ保持打开状态还是仅在必要时打开连接更好?

时间:2020-05-11 18:45:15

标签: python rabbitmq pika

我有一个循环进行一系列测试的应用程序。在失败的测试中,它将消息发布到RabbitMQ队列中,其他应用程序将对其进行监视和提取。有数百种测试,可能需要几分钟才能完成所有测试。由于应用程序会定期运行,因此测试会重复进行。

我的问题是,是否最好一次打开一个连接并使其保持打开状态,以便在循环通过所有测试后仅关闭才能发布?还是仅当我需要发布消息并在发送消息后关闭连接时才建立连接?

如果我的队列已经存在,还会再次调用queue_declare导致RabbitMQ / pika尝试重新创建或覆盖该队列吗?

这种方式:

message_con = pika.BlockingConnection(pika.URLParameters(app.conf['pika_url']))
channel = message_con.channel()
channel.queue_declare(queue='outage', durable=True, auto_delete=False, exclusive=False)

for test in tests:    
    # Do tests and stuff....
    if test_failed:
        channel.basic_publish(exchange='', routing_key='outage', body=json.dumps(message), properties=pika.BasicProperties(delivery_mode=2))

message_con.close()

或者这样:

for test in tests:
    # Do tests and stuff....
    if test_failed:
        message_con = pika.BlockingConnection(pika.URLParameters(app.conf['pika_url']))
        channel = message_con.channel()
        channel.queue_declare(queue='outage', durable=True, auto_delete=False, exclusive=False)
        channel.basic_publish(exchange='', routing_key='outage', body=json.dumps(message), properties=pika.BasicProperties(delivery_mode=2))
        message_con.close()

1 个答案:

答案 0 :(得分:0)

RabbitMQ中的客户端连接是长期的。通道也是长期存在的,但是客户端的任何错误/异常都可能导致通道关闭。因此,通道的寿命比连接的寿命短。不建议每次操作打开连接。打开连接涉及很多网络操作和开销。您可以通过单个连接打开多个频道。

参考-https://www.rabbitmq.com/api-guide.html#connection-and-channel-lifspan