rabbitmq和php-使用一个工作进程(代理)处理多个队列

rabbitmq和php-使用一个工作进程(代理)处理多个队列,php,rabbitmq,worker,php-amqp,Php,Rabbitmq,Worker,Php Amqp,我有1000个特定名称的队列。所以我想用一个代理处理这些队列。可能吗 队列名称存储在mysql数据库中,因此我应该获取主题并为每个主题运行代理。当然,它应该异步运行,并且应该能够将排队的项目传递给空闲的代理。这可能吗?或者我应该制作1000个带有特定队列名称的文件作为代理 更新: 这是我排队的照片。队列应以并行方式而不是串行方式运行。因此,用户是生产者,工作者是消费者,运行send\u message()方法 我可以向您展示如何使用library。我必须警告您,无法在一个进程中异步使用消息。尽管

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

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

更新: 这是我排队的照片。队列应以并行方式而不是串行方式运行。因此,用户是生产者,工作者是消费者,运行
send\u message()
方法


我可以向您展示如何使用library。我必须警告您,无法在一个进程中异步使用消息。尽管您可以运行一些为一组队列提供服务的进程。它们可以根据队列重要性划分为若干组

安装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();

我可以向您展示如何使用该库。我必须警告您,无法在一个进程中异步使用消息。尽管您可以运行一些为一组队列提供服务的进程。它们可以根据队列重要性划分为若干组

安装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();

它应该异步运行
-哪个部分应该是异步的?为什么它应该是异步的?你知道什么是异步吗?实际上我有点困惑。我更新了问题以证明我的目的。请再看一看。
它应该异步运行
-哪个部分应该是异步的?为什么它应该是异步的?你知道什么是异步吗?实际上我有点困惑。我更新了问题以证明我的目的。请再看一看。如果foo_队列和baz_队列中有一些项目,那么baz项目将在foo项目完成后处理?或者具有相同优先级并将在多个工作进程中一起处理?另一件事是,如果一个工作进程正在处理队列项目,那么另一个工作进程将获取相同的项目并处理它?或获取另一项?队列使用者始终在队列之间切换。如果在foo队列和bar队列中有一些消息,它将按foo、bar、foo、bar等顺序处理它们。无法获取当前正在处理的消息。这是RabbitMQ控制这些东西的责任。那么,如果我有1000个队列,第一个队列中的第二个项目将在处理完所有999个其他队列的第一个项目后进行处理?那么,如果foo_队列和baz_队列中有一些项目,baz项目将在foo项目完成后进行处理?或者具有相同优先级并将在多个工作进程中一起处理?另一件事是,如果一个工作进程正在处理队列项目,那么另一个工作进程将获取相同的项目并处理它?或获取另一项?队列使用者始终在队列之间切换。如果在foo队列和bar队列中有一些消息,它将按foo、bar、foo、bar等顺序处理它们。无法获取当前正在处理的消息。这是RabbitMQ控制这些东西的责任。所以,如果我有1000个队列,第一个队列中的第二个项目将在处理完所有其他队列的第一个项目后进行处理?