首页 > 解决方案 > 如何在php中优先考虑rabbitmq消息?

问题描述

我正在RabbitMQ (3.8.3 Erlang 22.3.1)使用Laravel (6.18.*). 为此,我正在使用https://github.com/vyuldashev/laravel-queue-rabbitmq

使用正常的队列和消费者,一切正常。为了确定消息的优先级,我在队列名称中定义了多个以 0-3 作为后缀的队列。我通过手动计算总作业将作业路由到不同的队列。

使用这种方法,对于不同的任务,我需要创建更多具有名称优先级的队列。创建队列名称中包含 0-3 的队列似乎不可扩展。

现在我正在尝试为每条消息设置优先级。为此,我尝试将priority属性AMQPMessage用作:

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

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

但是消费者似乎没有消费优先级为 2 的消息。

知道我在做什么错误吗?请让我知道是否有任何东西可以设置每条消息的优先级,以便消费者首先选择它们。

标签: phplaravelrabbitmq

解决方案


尝试使用 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);


推荐阅读