如何在php中设置rabbitmq消息的优先级?

ymzxtsji  于 2023-01-17  发布在  RabbitMQ
关注(0)|答案(2)|浏览(199)

我用RabbitMQ (3.8.3 Erlang 22.3.1)来表示Laravel (6.18.*),为此我使用https://github.com/vyuldashev/laravel-queue-rabbitmq
对于正常的队列和消费者,一切都很好。为了区分消息的优先级,我定义了多个队列,在队列名称中使用0-3作为后缀。我通过手动计算作业总数将作业路由到不同的队列。
使用这种方法,对于不同的任务,我需要创建更多的名称具有优先级的队列,创建队列名称中包含0-3的队列似乎不可伸缩。
现在我尝试为每条消息设置优先级。为此,我尝试使用AMQPMessage中的priority属性:

$msg = new AMQPMessage("Hello World!", array(
    'delivery_mode' => 2,
    'priority' => 1,
    'timestamp' => time(),
    'expiration' => strval(1000 * (strtotime('+1 day midnight') - time() - 1))
));

我尝试了不同优先级的多条消息,但优先级似乎根本不起作用。

  • 我在队列上设置了x-max-priority
  • 我将AMQPMessage的priority设置为1,并从一个终端发送100 K消息
  • 同时,我使用priority 2调度了另一组10条消息

但是使用者似乎没有使用优先级为2的消息。
你知道我犯了什么错误吗?请让我知道,如果有任何设置优先级的每一个消息,使消费者选择他们第一。

hi3rlvi2

hi3rlvi21#

尝试使用set,如下所示:

$headers = new AMQPTable([
    'x-cache-ttl' => 10 * 60000,
]);

$msg = new AMQPMessage($msg);
$msg->set('application_headers', $headers);
$msg->set('priority', 2);

不要忘记使用“x-max-priority”声明队列

$options = new AMQPTable([
    'x-max-priority' => 3,
]);

$connection = new AMQPStreamConnection(RABBIT_HOST, RABBIT_PORT, RABBIT_LOGIN, RABBIT_PASS);
$channel = $connection->channel();
$channel->queue_declare('queue_name', false, false, false, false, false, $options);
n1bvdmb6

n1bvdmb62#

当为队列声明x-max-priority时,它会引发异常。

operation queue.declare caused a channel exception precondition_failed: inequivalent arg 'x-max-priority' for queue 'my-queue in vhost '/': received the value '3' of type 'signedint' but current is none

如果我遗漏了什么请告诉我

相关问题