【问题标题】:rabbitmq and php - Process multiple queues with one worker (broker)rabbitmq 和 php - 使用一名工作人员(代理)处理多个队列
【发布时间】:2017-06-20 08:38:23
【问题描述】:

我有 1000 个具有特定名称的队列。所以我想用一个经纪人处理这些队列。有可能吗?

队列名称存储在 mysql db 中,因此我应该获取主题并为每个主题运行代理。当然它应该异步运行,并且应该能够将排队的项目传递给空闲的代理。这可能吗?或者我应该制作 1000 个具有特定队列名称的文件作为代理?

更新: 这是我排队的照片。队列应该以并行方式而不是串行方式运行。所以用户是生产者,工作者是运行send_message()方法的消费者;

【问题讨论】:

  • it should run asynchronously - 哪个部分应该是异步的?为什么它应该是异步的?你知道什么是异步吗?
  • 实际上对我来说有点困惑。我更新了问题以证明我的目的。请再看看。

标签: php rabbitmq worker php-amqp


【解决方案1】:

我可以向您展示如何使用 enqueue 库。我必须警告你,没有办法在一个进程中异步消费消息。尽管您可以运行一些服务于一组队列的进程。它们可以按队列重要性分组。

安装AMQP传输和消费库:

composer require enqueue/amqp-ext enqueue/enqueue

创建消费脚本。我假设您已经从数据库中获取了一组队列名称。它们存储在$queueNames var 中。该示例将相同的处理器绑定到所有队列,但您当然可以设置不同的处理器。

<?php

use Enqueue\AmqpExt\AmqpConnectionFactory;
use Enqueue\Consumption\QueueConsumer;
use Enqueue\Psr\PsrMessage;
use Enqueue\Psr\PsrProcessor;

// here's the list of queue names which you fetched from DB
$queueNames = ['foo_queue', 'bar_queue', 'baz_queue'];

$factory = new AmqpConnectionFactory('amqp://');

$context = $factory->createContext();

// create queues at RabbitMQ side, you can remove it if you do not need it
foreach ($queueNames as $queueName) {
    $queue = $context->createQueue($queueName);
    $queue->addFlag(AMQP_DURABLE);

    $context->declareQueue($queue);
}

$consumer = new QueueConsumer($context);

foreach ($queueNames as $queueName) {
    $consumer->bind($queueName, function(PsrMessage $psrMessage) use ($queueName) {
        echo 'Consume the message from queue: '.$queueName;

        // your processing logic.

        return PsrProcessor::ACK;
    });
}

$consumer->consume();

更多内容在doc

【讨论】:

  • 那么如果foo_queue和baz_queue中有一些项目,那么在foo项目完成后baz项目会处理吗?还是具有相同的优先级并在多个工作进程中一起处理?
  • 另一件事是,如果一个工作人员正在处理队列项目,那么另一个工作人员将获取相同的项目并处理它?还是取另一件物品?
  • 队列消费者一直在队列之间切换。如果您在 foo 队列和 bar 队列中有一些消息,它将按 foo、bar、foo、bar 等顺序处理它们。
  • 无法获取当前正在处理的消息。这是 RabbitMQ 控制这些东西的责任。
  • 所以如果我有 1000 个队列,第一个队列中的第二个项目将在处理完所有 999 个其他队列的第一个项目后处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
相关资源
最近更新 更多