美文网首页
php RabbitMQ延时队列,死信队列

php RabbitMQ延时队列,死信队列

作者: 江河湖海琴瑟琵琶 | 来源:发表于2020-11-26 16:02 被阅读0次

在RabbitMQ中,队列支持下面几个属性.
x-message-ttl: 10000 表示队列中的消息只能存活10秒,变成死信无特殊配置时,消息到期将被丢弃.
若不希望死信直接丢弃,可以通过队列的其他属性进行配置.把死信转发给另一个交换机

  1. x-dead-letter-exchange: myExchange带有此属性的队列,会把死信投递给此处设置的myExchange交换机
  2. x-dead-letter-routing-key: myKey,该属性设置了死信转发时使用的路由键.

代码实现PHP

定义普通队列时,配置好上述属性
<?php
namespace rabbitmq;
require_once './lib/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Wire\AMQPTable;

header('Content-Type: text/html; charset=gb2312');

try{
    //连接
    $connection = new AMQPStreamConnection('xxx.com', 5672, 'admin', 123456,'/',true);
    $channel = $connection->channel();

    //普通交换机
    $channel->exchange_declare('PHP-Direct-Exchange','direct');
    //定义普通队列
    $channel->queue_declare(
        'PHP-Queue',
        false,
        true,
        false,
        false,
        false,
        new AMQPTable([
            'x-message-ttl'=>15000,
            'x-dead-letter-exchange'=>'PHP-Dead-Exchange',
            'x-dead-letter-routing-key'=>'PHP-Dead-Key'
        ])
    );
    //绑定
    $channel->queue_bind('PHP-Queue','PHP-Direct-Exchange','key');

    //死信交换机
    $channel->exchange_declare('PHP-Dead-Exchange','direct');
    //死信队列
    $channel->queue_declare('PHP-Dead-Queue');
    //死信绑定
    $channel->queue_bind('PHP-Dead-Queue','PHP-Dead-Exchange','PHP-Dead-Key');

    //向普通队列发送消息
    $message = new AMQPMessage('hello world');
    $channel->basic_publish($message,'PHP-Direct-Exchange','key',true);

    $channel->close();
    $connection->close();
    
}catch (\Exception $exception){

    echo "异常信息".$exception->getMessage();
}

运行脚本,打开RabbitMQ后台,找到我们的普通队列,队列有以下属性


image.png 再观察发送的消息 初始.png
15秒后消息自动进入死信队列 15秒后.png

通过这个延时机制,可以代替部分定时任务,比如取消15分钟未支付的订单.

相关文章

网友评论

      本文标题:php RabbitMQ延时队列,死信队列

      本文链接:https://www.haomeiwen.com/subject/gmzaiktx.html