为 RabbitMQ 保持连接打开还是只在必要时打开更好?
Is it better to have a connection stay open for RabbitMQ or only open when necessary?
我有一个循环执行一系列测试的应用程序。在失败的测试中,它会向 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()
RabbitMQ 中的客户端连接应该是长期存在的。通道也是长期存在的,但是来自客户端的任何 error/exception 都可能导致通道关闭。因此,通道的寿命比连接短。强烈建议不要为每个操作打开一个连接。打开一个连接涉及大量的网络操作和开销。您可以从一个连接打开多个频道。
参考 - https://www.rabbitmq.com/api-guide.html#connection-and-channel-lifspan
我有一个循环执行一系列测试的应用程序。在失败的测试中,它会向 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()
RabbitMQ 中的客户端连接应该是长期存在的。通道也是长期存在的,但是来自客户端的任何 error/exception 都可能导致通道关闭。因此,通道的寿命比连接短。强烈建议不要为每个操作打开一个连接。打开一个连接涉及大量的网络操作和开销。您可以从一个连接打开多个频道。
参考 - https://www.rabbitmq.com/api-guide.html#connection-and-channel-lifspan