Php 按优先级使用多个队列

Php 按优先级使用多个队列,php,rabbitmq,php-5.4,php-amqp,Php,Rabbitmq,Php 5.4,Php Amqp,我让制作人向主题交换发送消息。每封邮件都包含一个路由密钥。(对原始图表示歉意) 我正在使用并试图使用大量队列。我试图实现的是按顺序测试每个队列,看看它是否有消息,如果有,处理它,否则,转到下一个队列。此外,如果发现消息,请从Q1开始再次启动检查过程。下面的代码不起作用,但将演示我想做的事情的逻辑 $connection = new AMQPConnection(HOST, PORT, USER, PASS, VHOST); $channel = $connection->channel()

我让制作人向主题交换发送消息。每封邮件都包含一个路由密钥。(对原始图表示歉意)

我正在使用并试图使用大量队列。我试图实现的是按顺序测试每个队列,看看它是否有消息,如果有,处理它,否则,转到下一个队列。此外,如果发现消息,请从Q1开始再次启动检查过程。下面的代码不起作用,但将演示我想做的事情的逻辑

$connection = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();

$channel->exchange_declare('myexchange', 'topic', false, false, false);

$channel->queue_declare("Q1", false, true, false, false);
$channel->queue_bind("Q1", 'myexchange', 'priority.1');

$channel->queue_declare("Q2", false, true, false, false);
$channel->queue_bind("Q2", 'myexchange', 'priority.2');

$channel->queue_declare("Q3", false, true, false, false);
$channel->queue_bind("Q3", 'myexchange', 'priority.3');

$channel->queue_declare("DFQ4", false, true, false, false);
$channel->queue_bind("DFQ4", 'myexchange', 'priority.4');

$queues = array('Q1','Q2','Q3','Q4');

$priority = 0;
while (1) {

    $priority = ($priority<4)? $priority+1 : 0;

    $msg = $channel->basic_consume($queues[$priority], $consumer_tag, false, false, false, false);
    if(isset($msg->body)) {
        echo ' [x] ',$msg->delivery_info['routing_key'], "\n";
        $channel->basic_ack($msg->delivery_info['delivery_tag']);
        $priority = 0;
    }
}

$channel->close();
$connection->close();
$connection=新的AMQPConnection(主机、端口、用户、PASS、VHOST);
$channel=$connection->channel();
$channel->exchange\u declare('myexchange','topic',false,false,false);
$channel->queue_declare(“Q1”,false,true,false,false);
$channel->queue_bind(“Q1”,“myexchange”,“priority.1”);
$channel->queue_declare(“Q2”,false,true,false,false);
$channel->queue_bind(“Q2”,“myexchange”,“priority.2”);
$channel->queue_declare(“Q3”,false,true,false,false);
$channel->queue_bind(“Q3”,“myexchange”,“priority.3”);
$channel->queue_declare(“DFQ4”,false,true,false,false);
$channel->queue_bind(“DFQ4”,“myexchange”,“priority.4”);
$queues=array('Q1','Q2','Q3','Q4');
$priority=0;
而(1){
$priority=($prioritybasic_-consume($queues[$priority],$consumer_-tag,false,false,false);
如果(设置($msg->body)){
回显“[x]”,$msg->delivery_info['routing_key]”,“\n”;
$channel->basic_ack($msg->delivery_info['delivery_tag']);
$priority=0;
}
}
$channel->close();
$connection->close();

我对我的.NET项目有相同的要求。基本上,我有类似的方法,但我使用头交换将发布的消息提供给这些队列。我创建的库订阅所有这些队列(具有相同的预取大小值)然后将所有这些消息放入内存队列,在内存队列中,这些消息可以按优先级排序。因此,在管道的末尾,处理消息的实际代码将从内部队列中读取消息,优先级较高的消息将被处理,然后在优先级较低的消息之前进行确认。

我不明白您为什么要这样做你想再次检查队列,而不是在收到消息时处理它。我不明白,当你可以声明你想要的任何数量的消费者并并行处理所有事情时,为什么你需要优先级。第一季度的消息应该在第二季度的消息之前处理,在第三季度的消息之前处理,依此类推。比如,在某个时间点,有仅在第四季度处理消息。一条消息将被处理,然后在第四季度尝试处理下一条消息之前,检查第一季度、第二季度和第三季度是否出现任何消息。第一季度的作业需要首先完成,因此需要优先级。Doug Barth描述了一种可能的解决方案[您是否尝试使用代码而不是基本消费?
$connection = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();

$channel->exchange_declare('myexchange', 'topic', false, false, false);

$channel->queue_declare("Q1", false, true, false, false);
$channel->queue_bind("Q1", 'myexchange', 'priority.1');

$channel->queue_declare("Q2", false, true, false, false);
$channel->queue_bind("Q2", 'myexchange', 'priority.2');

$channel->queue_declare("Q3", false, true, false, false);
$channel->queue_bind("Q3", 'myexchange', 'priority.3');

$channel->queue_declare("DFQ4", false, true, false, false);
$channel->queue_bind("DFQ4", 'myexchange', 'priority.4');

$queues = array('Q1','Q2','Q3','Q4');

$priority = 0;
while (1) {

    $priority = ($priority<4)? $priority+1 : 0;

    $msg = $channel->basic_consume($queues[$priority], $consumer_tag, false, false, false, false);
    if(isset($msg->body)) {
        echo ' [x] ',$msg->delivery_info['routing_key'], "\n";
        $channel->basic_ack($msg->delivery_info['delivery_tag']);
        $priority = 0;
    }
}

$channel->close();
$connection->close();