RabbitMQ死信队列原理并实现延迟队列

码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071

死信队列

死信交换机(Dead-Letter-Exchange),当消息在一个队列中变成死信之后,它能被发送到另一个交换机中,这个交换机就是DLX,绑定DLX的队列就称之为死信队列

消息变成死信一般是由于下面三种情况:

  • 消息被拒绝(Basic.Reject或Basic.Nack),并在调用时设置requeue参数为false
  • 消息过期
  • 队列达到最大长度

通过在channel.queueDeclare方法中设置x-dead-letter-exchange参数来为这个队列添加DLX

延迟队列

定义2个队列,第一个队列通过设置消息或队列的有效期,使消息到期后变为死信进入到第二个队列中,而我们只消费第二个队列,则可实现延迟队列,下面是用php-amqplib实现的一分钟的延迟队列

<?php
require_once __DIR__.'/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'why', 'why');
$channel = $connection->channel();

//测试死信的上游交换机
$channel->exchange_declare('dlxBeforeExchange', 'direct',
    false, true, false, false, false, []);
//死信的交换机
$channel->exchange_declare('dlxExchange', 'direct',
    false, true, false, false, false, []);

//测试死信队列的上游队列
$dlx_table = new \PhpAmqpLib\Wire\AMQPTable();
$dlx_table->set('x-dead-letter-exchange', 'dlxExchange' );
$dlx_table->set('x-dead-letter-routing-key', 'dlxKey' );
$channel->queue_declare('dlxBeforeQueue',
    false, true, false, false, false, $dlx_table);
$channel->queue_bind('dlxBeforeQueue', 'dlxBeforeExchange', 'dlxBeforeKey');
//死信队列
$channel->queue_declare('dlxQueue',
    false, true, false, false, false);
$channel->queue_bind('dlxQueue', 'dlxExchange', 'dlxKey');


$head = array_merge(array('content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT), ['expiration' => '60000']);
$msg = new AMQPMessage('hello why', $head);
$res = $channel->basic_publish($msg, 'dlxBeforeExchange', 'dlxBeforeKey');

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AirGo.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值