合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
>[info] 死信队列机制 **什么是死信队列?**(回收站队列) DLX - 死信队列(dead-letter-exchange) 利用DLX,当消息在一个队列中变成死信 (dead message) 之后,它能被重新publish到另一个Exchange中,这个Exchange就是DLX ***** **死信队列的产生场景** * 消息被拒绝(basic.reject / basic.nack),并且requeue = false * 消息因TTL过期 * 队列达到最大长度 ***** **死信的处理过程** DLX亦为一个普通的Exchange,它能在任何队列上被指定,实际上就是设置某个队列的属性 当某队列中有死信时,RabbitMQ会自动地将该消息重新发布到设置的Exchange,进而被路由到另一个队列 可以监听这个队列中的消 息做相应的处理.该特性可以弥补RabbitMQ 3.0以前支持的immediate参数的功能 ***** **死信队列的配置** 设置死信队列的exchange和queue,然后进行绑定 - Exchange:dlx.exchange - Queue: dlx.queue - RoutingKey:# 正常声明交换机、队列、绑定,只不过我们需要在队列加上一个参数即可arguments.put(" x-dead-letterexchange","dlx.exchange"); 这样消息在过期、requeue、 队列在达到最大长度时,消息就可以直接路由到死信队列! ***** **代码示例:dlx.php** ~~~ <?php include(__DIR__ . '/config.php'); use PhpAmqpLib\Wire\AMQPTable; use PhpAmqpLib\Message\AMQPMessage; use PhpAmqpLib\Exchange\AMQPExchangeType; use PhpAmqpLib\Connection\AMQPStreamConnection; /** * 死信队列测试 * 1、创建两个交换器 exchange.normal 和 exchange.dlx, 分别绑定两个队列 queue.normal 和 queue.dlx * 2、把 queue.normal 队列里面的消息配置过期时间,然后通过 x-dead-letter-exchange 指定死信交换器为 exchange.dlx * 3、发送消息到 queue.normal 中,消息过期之后流入 exchange.dlx,然后路由到 queue.dlx 队列中,进行消费 */ // todo 更改配置 //$connection = new AMQPStreamConnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/'); $connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST); $channel = $connection->channel(); $channel->exchange_declare('exchange.dlx', AMQPExchangeType::DIRECT, false, true); $channel->exchange_declare('exchange.normal', AMQPExchangeType::FANOUT, false, true); $args = new AMQPTable(); // 消息过期方式:设置 queue.normal 队列中的消息10s之后过期 $args->set('x-message-ttl', 10000); // 设置队列最大长度方式: x-max-length //$args->set('x-max-length', 1); $args->set('x-dead-letter-exchange', 'exchange.dlx'); $args->set('x-dead-letter-routing-key', 'routingkey'); $channel->queue_declare('queue.normal', false, true, false, false, false, $args); $channel->queue_declare('queue.dlx', false, true, false, false); $channel->queue_bind('queue.normal', 'exchange.normal'); $channel->queue_bind('queue.dlx', 'exchange.dlx', 'routingkey'); $message = new AMQPMessage('Hello DLX Message'); $channel->basic_publish($message, 'exchange.normal', 'rk'); $channel->close(); $connection->close(); ~~~ 1. 运行代码 ![](https://img.kancloud.cn/56/6a/566a8a3da8dd137ff80829a238c4987e_341x54.png) 2. 查看控制台 ![](https://img.kancloud.cn/b0/a8/b0a870b170422e7266aa5e0cefdd5784_1196x279.png) 3. 10 秒后查看控制台 ![](https://img.kancloud.cn/e3/84/e38447e93bd3e09be6dac2f8762ac237_1117x288.png) 4.