【问题标题】:RabbitMQ Python Pika - Connection handling for multiple messagesRabbitMQ Python Pika - 多条消息的连接处理
【发布时间】:2020-04-20 17:12:42
【问题描述】:

我一直在阅读有关正确设置 RabbitMQ 连接以进行发布的多个博客和文档。下面是我的场景

  • 执行某些任务并将输出发布到 RabbitMQ 的计划作业很少
  • 作业以不同的时间间隔运行,但输出将发布到同一个 RabbitMQ 队列

以下是实现

def get_credentials(self):
    print ("Host ", config_reader.get_lookup_data('RABBITMQ', 'host'))
    credentials = pika.PlainCredentials(config_reader.get_lookup_data('RABBITMQ', 'user'),
                                        config_reader.get_lookup_data('RABBITMQ', 'password'))
    return credentials

def publish_message(self, message):
    print ("Publish message" , message)
    connection = pika.BlockingConnection(
        pika.ConnectionParameters(host=config_reader.get_lookup_data('RABBITMQ', 'host'),
                                  credentials=self.get_credentials()))
    channel = connection.channel()
    channel.exchange_declare(exchange=config_reader.get_lookup_data('RABBITMQ', 'exchange'), passive=True)
    result = channel.queue_declare(exclusive=False,
                                   queue=config_reader.get_lookup_data('RABBITMQ', 'sensor_queue'))
    channel.queue_bind(result.method.queue,
                       exchange=config_reader.get_lookup_data('RABBITMQ', 'exchange'),
                       routing_key=config_reader.get_lookup_data('RABBITMQ', 'routing_key'))
    print ('Publishing message ', message)
    channel.basic_publish(exchange=config_reader.get_lookup_data('RABBITMQ', 'exchange'), body=json.dumps(message),
                          routing_key=config_reader.get_lookup_data('RABBITMQ', 'routing_key'),
                          properties=pika.BasicProperties(
                              headers={'Content-Type': 'application/json'}  # Add a key/value header
                          ))
    print ('published')

我观察到上面的实现是每个作业都建立一个连接,然后是一个通道。我怀疑这种类型的实现是否会造成不必要的开销。

有人可以建议处理连接对象的正确方法吗?我个人觉得为每条消息创建连接肯定是开销

【问题讨论】:

    标签: python rabbitmq pika


    【解决方案1】:

    https://www.rabbitmq.com/tutorials/amqp-concepts.html#amqp-connections

    TL;DR

    AMQP 连接是长期存在的。 AMQP 连接的握手过程相当复杂,至少需要 7 个 TCP 数据包(如果使用 TLS 则更多)。最佳实践是重用连接并在线程之间使用通道多路复用连接。

    连接池详情: 至少有 10 个连接的连接池。如果需要超过 10 个,则可以创建新连接。池中的最大连接数可以是 40。可以设置关闭连接的时间限制,以便关闭连接而不是永远存在。

    参考:https://www.cloudamqp.com/blog/2018-01-19-part4-rabbitmq-13-common-errors.html

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2023-03-16
      相关资源
      最近更新 更多