我有一个循环进行一系列测试的应用程序。在失败的测试中,它将消息发布到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()
答案 0 :(得分:0)
RabbitMQ中的客户端连接是长期的。通道也是长期存在的,但是客户端的任何错误/异常都可能导致通道关闭。因此,通道的寿命比连接的寿命短。不建议每次操作打开连接。打开连接涉及很多网络操作和开销。您可以通过单个连接打开多个频道。
参考-https://www.rabbitmq.com/api-guide.html#connection-and-channel-lifspan