Rabbitmq两种实现延迟队列方式----死信和延迟插件

本文介绍了使用RabbitMQ实现延迟队列的两种方法:通过死信队列转换和使用延迟插件。在死信队列方法中,需要配置正常和死信交换机及队列,消息在指定时间后从正常队列转移到死信队列。而使用延迟插件则更简便,只需安装插件并声明延迟交换机和队列,通过设置x-delay参数即可实现延迟。代码示例展示了如何声明交换机和发送延迟消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rabbitmq两种实现延迟队列方式----死信和延迟插件

每天多学一点点~
话不多说,这就开始吧…

1.前言

平时工作中用到延迟队列的地方还是蛮多的;这里介绍下两种方式;一种通过死信队列转延迟队列;一种直接安装延迟插件实现延迟队列。

2.死信队列转延迟队列

在这里插入图片描述
以下直接在控制台声明了

  1. 正常交换机 zjq.test.dlx.normal.exchange fanout
  2. 死信交换机 zjq.test.dlx.exchange fanout
  3. 正常队列 zjq.test.dlx.normal.queue
  4. 死信队列 zjq.test.dlx.queue

步骤:

  1. 正常交换器 绑定 正常队列
  2. 正常队列 绑定 死信交换机 (加上2个参数 1. ttl:10s 就是过期时间,即延迟时间 2.x-dead-letter-exchange:zjq.test.dlx.exchange 绑定死信交换机 )
  3. 死信交换机 绑定 死信队列
  4. 只监听死信队列,不监听正常队列
  5. 往 正常交换机 发信消息 ,推到正常队列;正常队列没人消费,10s过后,转到 死信交换机 ,推到死信 队列 ,然后消费死信队列,实现延迟队列功能

在这里插入图片描述

这种还是比较麻烦的,要声明2个交换机+2个队列

3.延迟插件实现延迟队列

3.1 插件安装

下载对应版本的插件 rabbitmq_delayed_message_exchange-3.7.9.ez,
放入 RabbitMQ安装目录下的 plugins 目录。 进入RabbitMQ安装目录下的 sbin目录,在cmd窗口下执行如下命令使插件生效 如果后面发现在未失效请重启服务再查看

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

在这里插入图片描述

3.2 控制台声明推消息

  1. 延迟交换机 zjq.test.delay.exchange type:x-delayed-message Arguments x-delayed-type:topic
  2. 延迟队列 zjq.test.delay.queue
  3. 延迟交换机 绑定 延迟队列
    在这里插入图片描述
    推消息。因为博主这里声明的是fanout,所以没有routing key。
    header上加上参数 x-delay:10000 延迟时间
    在这里插入图片描述

3.3 代码声明

声明交换机

  @Bean
    public CustomExchange delayExchange() {
        Map<String, Object> args = new HashMap<>();
        args.put("x-delayed-type", "fanout");
        return new CustomExchange(MqConst.ORDER_TO_PRODUCT_DELAY_EXCHANGE_NAME, "x-delayed-message", true, false, args);
    }

发送消息

    public void senderDelayCheckMsg(MsgTxtBo msgTxtBo) {
        log.info("发送的消息ID:{}", msgTxtBo.getOrderNo());
        //表示为延时消息   加了 _delay 后缀 普通写法
        CorrelationData correlationData = new CorrelationData(msgTxtBo.getMsgId() + "_" + msgTxtBo.getOrderNo() + "_delay");
        // lamada  表达式写法  延迟 发送
        rabbitTemplate.convertAndSend(MqConst.ORDER_TO_PRODUCT_DELAY_EXCHANGE_NAME, MqConst.ORDER_TO_PRODUCT_DELAY_ROUTING_KEY,
                msgTxtBo, message -> {
            // 设置这个才有用
            message.getMessageProperties().setHeader("x-delay", 10000);
            return message;
        },correlationData);
       
    }

4.结语

世上无难事,只怕有心人,每天积累一点点,fighting!!!

### RabbitMQ实现延迟队列的方法最佳实践 RabbitMQ 提供了多种方法来实现延迟队列,每种方法都有其适用场景优缺点。以下是常见的两种实现方式及其最佳实践: #### 1. 基于 x-delayed-message 插件延迟队列 RabbitMQ 支持通过安装 `x-delayed-message` 插件来直接实现延迟队列的功能。这种方式的优点在于配置简单且易于理解。 ##### 配置步骤: - 安装插件:下载并启用 `rabbitmq_delayed_message_exchange` 插件- 创建交换机:声明一个类型为 `x-delayed-message` 的交换机,并为其绑定目标队列。 - 发布消息时设置延迟时间:在发送消息时,通过消息属性中的 `headers.x-delay` 字段指定延迟毫秒数。 ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters(&#39;localhost&#39;)) channel = connection.channel() # 声明延迟队列所需的交换机 channel.exchange_declare(exchange=&#39;delayed_messages&#39;, exchange_type=&#39;x-delayed-message&#39;, arguments={&#39;x-delayed-type&#39;: &#39;direct&#39;}) message = &#39;Delayed message&#39; properties = pika.BasicProperties(headers={&#39;x-delay&#39;: 5000}) # 设置延迟时间为5000ms channel.basic_publish( exchange=&#39;delayed_messages&#39;, routing_key=&#39;key.delay&#39;, body=message, properties=properties) print(f"Sent delayed message: {message}") connection.close() ``` 此方法适用于需要精确控制延迟时间简化开发流程的应用场景[^1]。 #### 2. 基于死信交换器(Dead Letter Exchange, DLX) TTL 的延迟队列 另一种常见的方式是结合 RabbitMQ 的消息过期机制(TTL)与死信交换器功能实现延迟队列。 ##### 实现原理: - **TTL**:为消息或队列设置生存时间(Time To Live)。当消息超过设定的时间后会被丢弃或路由到死信交换器。 - **DLX**:将超时的消息重新投递给另一个队列以完成后续处理逻辑。 ##### 步骤描述: - 创建源队列 A 并开启死信功能; - 设定消息存活期限(per-message 或 per-queue TTL); - 绑定死信交换器至目标队列 B; - 消息到达时限后自动进入队列 B 待消费。 这种方法更加灵活,尤其适合复杂的业务需求环境[^1]。 --- #### 最佳实践总结 - **选择合适的技术路径**:如果项目追求快速部署且不需要高度定制化的解决方案,则推荐使用官方支持较好的插件法;反之,若需兼顾扩展性兼容性,则可选用基于标准特性的 DLX+TTL 方法[^2]。 - **监控资源消耗情况**:无论是哪种技术手段都需要密切跟踪服务器负载变化趋势,及时调整参数避免因大量积压待处理项而造成性能瓶颈问题出现[^3]。 - **优化消费者端行为模式**:针对高频次短延时期间内的请求流,考虑引入批量拉取策略或是预加载缓存区等方式提高吞吐量表现水平[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值