【问题标题】:Symfony2, RabbitMQ: I'm lostSymfony2,RabbitMQ:我迷路了
【发布时间】:2015-05-28 13:02:56
【问题描述】:

我已经安装了 RabbitMQ Bundle。现在这是我想做的:

Controller:创建Redis-List,将消息推送到客户端,然后将消息发送到队列中,因此可以异步执行较重的后台任务。

但我迷路了。

$msg = array('userid' => $someid);
$this->get('old_sound_rabbit_mq.task_example_producer')->publish(serialize($msg));

这会向产品发送一些数据吗?并且相应的消费者将执行繁重的后台任务(数据库查询等,基于生产者的“用户ID”)?我需要回调吗?排什么队?!队列将生产者的消息一一转发给消费者?那么我可以让多个消费者同时处理更多消息吗?!

【问题讨论】:

  • 在集成 RabbitMQ(和 AMQP)之前,您应该让自己习惯。他们的 php 教程非常好,可以帮助您了解队列是什么,如何订阅它,“异步”是什么意思等。rabbitmq.com/tutorials/tutorial-one-php.html
  • 对于那些需要 Symfony 和 OldSound RabbitMQ 包的完整示例用法的人,see this blog

标签: symfony rabbitmq


【解决方案1】:

有点旧的帖子,但以防其他人来寻求帮助:

您似乎正在使用 old_sound 的 rabbitmq 捆绑包。它在这里有一些有用的教程类型的文档:https://github.com/videlalvaro/RabbitMqBundle

它帮助我在 symfony 中使用 rabbitmq。

简而言之:

1:您需要在 config.yml 文件中进行一些配置。例如:

# RabbitMQ Configuration
old_sound_rabbit_mq:
    connections:
        default:
            host:        'localhost'
            port:        5672
            user:        'guest'
            password:    'guest'
            vhost:       '/'
            lazy:        true
            connection_timeout: 3
            read_write_timeout: 3

            # requires php-amqplib v2.4.1+ and PHP5.4+
            keepalive: false

            # requires php-amqplib v2.4.1+
            heartbeat: 0

    producers:
        task_example:
            connection:       default
            exchange_options: {name: 'task_example', type: direct}
    consumers:
        task_example:
            connection:       default
            exchange_options: {name: 'task_example', type: direct}
            queue_options:    {name: 'task_example'}
            callback:         test_class

这里定义了连接,一个生产者和一个消费者。两者都使用相同的“默认”连接。 您还需要将回调定义为服务:

# My services
services:
   test_class:
      class:      AppBundle\Testclasses\rabbittest\testclass
      arguments:  [@logger]

2:现在你需要有消费者,也就是这里的回调选项,“test_class”。简单的消费者可能如下所示:

namespace AppBundle\Testclasses\rabbittest;

use OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface;
use PhpAmqpLib\Message\AMQPMessage;

class testclass implements ConsumerInterface
{
   private $logger; // Monolog-logger.

   // Init:
   public function __construct( $logger )
   {
      $this->logger = $logger;
      echo "testclass is listening...";
   }

   public function execute(AMQPMessage $msg)
   {
      $message = unserialize($msg->body);
      $userid = $message['userid'];
      // Do something with the data. Save to db, write a log, whatever.
   }
}

3:现在您已经拥有的制作人:

$msg = array('userid' => $someid);
$this->get('old_sound_rabbit_mq.task_example_producer')->publish(serialize($msg));

4:最后一个难题是运行消费者。消费者是从控制台启动的,我是在 Windows 机器上开发的,并且使用了 Windows PowerShell。你可以这样启动消费者:

php app/console rabbitmq:consumer task_example

它应该给你文本:

testclass 正在听...

,如果你从这个例子中复制了它。该文本不是必需的,没有它,控制台将不会输出任何内容,但可以正常工作。除非出现一些错误。

但请记住,您必须位于 symfony 应用程序所在的目录中。例如:

C:\wamp\www\symfony\my_project

【讨论】:

  • 生产者文件是什么样的?似乎找不到一个很好的例子
  • @Notflip:见第 3 点。生产者文件可以看起来像任何东西,它只需要这两行来生成查询。 Producer 不需要任何其他内容,除非您在自己的服务(类)中。然后你需要将rabbitmq.producer注入其中。
【解决方案2】:

队列是您要处理的消息列表。

交换器是消息到队列的路由器。 (例如,您可以将多个队列列出到同一个交易所)。

生产者将消息推送到交换器。

消费者从队列中读取消息。

通常您有一个生产者和多个消费者来并行处理消息。

您发布的代码演示了生产者发布到交易所。

【讨论】:

    【解决方案3】:

    RabbitMQBundle 希望您深入了解代理内部结构。这并不总是你想要的。

    a solution 隐藏了所有细节,留下了一个简单但功能强大的界面供您使用。文档是short。如果您遵循它,您将获得对 RabbitMQ 实际工作原理零了解的有效解决方案。

    附:这是how to migrate from RabbitMQBundle to EnqueueBundle上的博文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2015-02-07
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多