当前位置: 首页 > 知识库问答 >
问题:

在为Symfony2使用RabbitMQ包时,防止在RabbitMQ中创建多个连接

周和安
2023-03-14

我将RabbitMQ包用于Symfony2 web框架。我的问题是,在TERMINAL中运行多个workers后,如何避免创建多个连接(以防止使代理过载)?在下面的示例中,我运行了两个workers,结果有两个connections/channel。

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

共有1个答案

金伟
2023-03-14

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

 类似资料:
  • 我正在用Spring编写一个服务,并使用Spring AMQP连接到Rabbitmq。 我有两个rabbitmq集群,一个仅用于发布消息(消息通过联合插件发送到另一个集群),另一个集群用于声明最终用户将从中使用的队列。 节点位于aws lb后面,每个集群有一个lb。 我在代码中使用CachingConnectionFactory和RabbitTemboard、RabbitAdmin,我希望与所有节

  • 我在 RabbitMQ 中创建新队列时遇到了一些问题。我只创建一个使用者客户端,该客户端将使用来自另一个微服务的消息。 这是我到目前为止所做的。 应用程序属性: 配置类: 和侦听器类: 当我运行这个程序时,我有一条ACCESS_REFUSED消息,但我不知道为什么。我错过了什么吗?? 谢谢

  • 我读过很多关于RabbitMQ中交换的文章。但我找不到任何有用的文章来解释每个交换的用例。他们所说的是 直接交换-绑定密钥和路由密钥应该相同。 主题交换-路由键应与绑定键的路由模式匹配。 扇出交换——所有绑定到特定交换的队列都将得到消息。 标题交换-标题应该与关键字匹配。 有人能详细解释它的每个交换和用法吗?

  • 我花了整整一天的时间来尝试让spring-AMQP示例项目在docker版本的RabbitMQ上运行。我只是在运行标准的rabbitmq Docker。虽然我没有连接问题,但我总是得到与创建队列相关的异常,并且我已经尝试了所有可能的变体,在这一点上。 我尝试在我的配置中声明队列,就像示例项目一样。我尝试显式配置RabbitAdmin。我已经尝试显式配置整个自动配置混乱。我在rabbitmq中创建了

  • 我想创建一个可以从不同线程调用的RabbitMQ发布服务器。 基于RabbitMQ最佳实践,我不应该允许在不同线程中使用同一通道,因此在发布服务器的多个实例中共享此通道将会导致问题。 我能想到的唯一解决方案是拥有一个具有内部队列的管理器线程,该队列实现一个内部生产者-消费者,而单个消费者仅存在于该线程中。 有没有更简单的方法?由于显而易见的原因,希望尽可能避免同步,但此解决方案不允许这样做。

  • 我在vm上运行rabbitMQ服务器。我正在学习rabbitMQ java教程。它在vm上本地运行良好,但当尝试从主机发送时,我遇到了一个异常 以下是我正在使用的发送代码: 我可以ping服务器在192.168.198.100但我不能访问管理UI在192.168.198.100:15672/ 有人能帮我弄清楚这个问题出了什么问题吗?提前感谢。