在将 RabbitMQ Bundle 用于 Symfony2 时防止在 RabbitMQ 中创建多个连接

Posted

技术标签:

【中文标题】在将 RabbitMQ Bundle 用于 Symfony2 时防止在 RabbitMQ 中创建多个连接【英文标题】:Prevent creating multiple connections in RabbitMQ while using RabbitMQ Bundle for the Symfony2 【发布时间】:2016-06-18 09:12:34 【问题描述】:

我正在使用RabbitMQ Bundle for the Symfony2 web framework。我的问题是,在终端运行许多工作人员后,如何避免创建多个连接(to prevent overloading the broker)?在下面的示例中,我运行了两个工作人员并最终拥有两个连接/通道。

config.yml

old_sound_rabbit_mq:
    connections:
        default:
            host:     127.0.0.1
            port:     5672
            user:     guest
            password: guest
            vhost:    /
            lazy:     true
    producers:
        order_create_bmw:
            connection:       default
            exchange_options:  name: order_create_ex, type: direct 
            queue_options:
                name: order_create_bmw_qu
                routing_keys:
                    - bmw
    consumers:
        order_create_bmw:
            connection:       default
            exchange_options:  name: order_create_ex, type: direct 
            queue_options:
                name: order_create_bmw_qu
                routing_keys:
                    - bmw
            callback:         application_frontend.consumer.order_create_bmw

services.yml

services:
    application_frontend.producer.order_create_bmw:
        class: Application\FrontendBundle\Producer\OrderCreateBmwProducer
        arguments:
            - @old_sound_rabbit_mq.order_create_bmw_producer

制片人

namespace Application\FrontendBundle\Producer;

use Application\FrontendBundle\Entity\Order;
use OldSound\RabbitMqBundle\RabbitMq\ProducerInterface;

class OrderCreateBmwProducer

    private $producer;

    public function __construct(ProducerInterface $producer)
    
        $this->producer = $producer;
    

    public function add(Order $order)
    
        $message = [
            'order_id' => $order->getId(),
            'car_model' => $order->getCarModel(),
            'timestamp' => date('Y-m-d H:i:s')
        ];

        $this->producer->publish(json_encode($message), 'bmw');
    

运行工人

$ app/console rabbitmq:consumer order_create_bmw
$ app/console rabbitmq:consumer order_create_bmw

RabbitMQ 管理

【问题讨论】:

【参考方案1】:

每个连接到 rabbitmq 的客户端(无论是发布者还是订阅者)都会创建一个连接。除了使用更少的客户端之外,我想不出任何其他方法来实现这一点。我也想不出这样做的理由:) 如果是性能,那么实际上拥有更多订阅者将有助于“清空”交易所(和队列)。

【讨论】:

以上是关于在将 RabbitMQ Bundle 用于 Symfony2 时防止在 RabbitMQ 中创建多个连接的主要内容,如果未能解决你的问题,请参考以下文章

matlab_第八章章符号计算

matlab_第八章章符号计算

Module API

Module API

`bundle install` 在 EC2 实例上失败

存储在 RabbitMQ 持久存储中时加密消息