如何在php中对rabbitmq消息进行优先级排序



我将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,并从一个终端发送100K消息
  • 与此同时,我用priority2发送了另一组10条消息

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

你知道我在犯什么错误吗?请告诉我是否有什么可以为每条消息设置优先级,以便消费者首先选择它们。

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

最新更新