`
阅读更多
死信队列&死信交换器:DLX 全称(Dead-Letter-Exchange),称之为死信交换器,当消息变成一个死信之后,如果这个消息所在的队列存在x-dead-letter-exchange参数,那么它会被发送到x-dead-letter-exchange对应值的交换器上,这个交换器就称之为死信交换器,与这个死信交换器绑定的队列就是死信队列。   死信消息:
  1. 消息被拒绝(Basic.Reject或Basic.Nack)并且设置 requeue 参数的值为 false
  2. 消息过期了
  3. 队列达到最大的长度
过期消息:     在 rabbitmq 中存在2种方可设置消息的过期时间,第一种通过对队列进行设置,这种设置后,该队列中所有的消息都存在相同的过期时间,第二种通过对消息本身进行设置,那么每条消息的过期时间都不一样。如果同时使用这2种方法,那么以过期时间小的那个数值为准。当消息达到过期时间还没有被消费,那么那个消息就成为了一个 死信 消息。     队列设置:在队列申明的时候使用 x-message-ttl 参数,单位为 毫秒     单个消息设置:是设置消息属性的 expiration 参数的值,单位为 毫秒   延时队列:在rabbitmq中不存在延时队列,但是我们可以通过设置消息的过期时间和死信队列来模拟出延时队列。消费者监听死信交换器绑定的队列,而不要监听消息发送的队列。   有了以上的基础知识,我们完成以下需求: 需求:用户在系统中创建一个订单,如果10s后,用户没有进行支付,那么自动取消订单。 分析:         1、上面这个情况,我们就适合使用延时队列来实现,那么延时队列如何创建         2、延时队列可以由 过期消息+死信队列 来时间         3、过期消息通过队列中设置 x-message-ttl 参数实现         4、死信队列通过在队列申明时,给队列设置 x-dead-letter-exchange 参数,然后另外申明一个队列绑定x-dead-letter-exchange对应的交换器
  伪代码如下:

 
消息大致流转过程

 
完整代码: 代码如下:https://gitee.com/huan1993/rabbitmq/tree/master/rabbitmq-advance/src/main/java/com/huan/rabbitmq/advance/dlx  
  • 大小: 104.6 KB
  • 大小: 71.9 KB
分享到:
评论
相关资源推荐
  • RabbitMQ随手笔记(十四)死信队列、延迟队列(.netCore2.0) DLX,Deal-Letter-Exchange,死信交换器。当一个小小在队列中变成死信(DeadMessage)之后,他能被重新发送到DLX中,与DLX绑定到队列就是死信队列。消息变成死信队列的情况:1.消息被拒绝,并且设置ReQueue参数false;2.消息过期;3.队列打到最大长度;生产者发送一条消息,经过交换器exchange_normal顺利存储到队列queue_normal中;由队列...
  • rabbitmq死信队列延时队列使用 数,那么它会被发送到x-dead-letter-exchange对应值的交换器上,这个交换器就称之为死信交换器,与这个死信交换器绑定的队列就是死信队列。   死信消息: 消息被拒绝(Basic.Reject或Basic.Nack)并且设置 requeue 参数的值为 false 消息过期了 队列达到最大的长度 过期消息:     在 rabbitmq 中存在2种方可设置消息的过期时间,第一种通过对队列进行设置,这种设置后,该队列中所有的消息都存在相同的过期时间,第二种通过对消息本身进行设置
  • rabbitmq利用死信队列+TTL 实现延迟队列
  • 使用RabbitMQ死信实现延迟消息 spring boot 配置, Rabbitmq集成, 利用死信 实现延时消息队列实现
  • RabbitMQ死信机制实现延迟队列 延迟队列 延迟队列存储的对象肯定是对应的延时消息,所谓”延时消息”是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费。 应用场景 三方支付,扫码支付调用上游的扫码接口,当扫码有效期过后去调用查询接口查询结果。实现方式:每当一笔扫码支付请求后,立即将此订单号放入延迟队列中(RabbitMQ),队列过期时间为二维码有效期,此队列没有设置消费者,过了...
  • rabbimq队列死信队列和延迟队列         在项目开发设计过程中,我们经常用到异步推送的场景,比如下单和扣减库存异步执行。常用的异步中间件有mq有很多,我们这里以Rabbitmq为例进行讲解。我们知道只要是涉及异步场景的问题,就有成功失败之分,如果生产者发送消息一直失败要怎么做呢,这里我们就用到了死信队列来实现失败消息的处理。流程图如下图:废话不多说直接上代码:rabbitmq配置类:package com.mq.test....
  • Spring Boot + RabbitMQ死信机制实现延迟队列
  • RabbitMQ(六)使用Dead Letter(死信队列)进行延时发送 在我们实际业务中,经常会碰到需要延时处理的问题.例如A操作5分钟后触发B操作.这些也可以使用定时器来实现. 考虑以下情况. 1.客户端提交订单A. 2.服务端F新增订单A,通过Rabbitmq发送新增订单消息M1到服务F2.返回新增成功到客户端(M模块不影响主业务). 3.客户端收到新增成功后,取消订单A. 4.服务端F取消订单A,发送取消订单消息M2到模块M 5.偶尔出现服务F2先消
  • Spring Cloud Stream RabbitMQ 配置死信队列,消费死信队列 Spring Cloud Stream RabbitMQ 配置死信队列,消费死信队列 Application.java package com.buxiaoxia; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springfr...
  • Cash Loan(四):RabbitMQ死信队列的应用 【前言】       最近在项目中用到了RabbitMQ来做异步处理,自己将这块儿系统的搞了搞,下面主要记录一下自己在研究过程中对死信队列的一些研究。【实践】        一、如何配置死信队列?               1、增加死信队列(exchange-ttl-to.queue)                2、增加死信交换机(exchange-ttl-to)并绑定死信队列       ...
  • spring boot 自学笔记(五) Rabbitmq集成,延时消息队列实现 本篇主要记录Spring boot 集成Rabbitmq,分为两部分, 第一部分为创建普通消息队列, 第二部分为延时消息队列实现:   spring boot提供对mq消息队列支持amqp相关包,引入即可:   <!-- rabbit mq --> <dependency> <groupId>org.springframew...
  • rabbitmq 延迟,死信队列
  • RabbitMQ死信队列 DLX, Dead-Letter-Exchange。利用DLX, 当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX。消息变成死信一向有一下几种情况: 消息被拒绝(basic.reject/ basic.nack)并且requeue=false 消息TTL过期(参考:RabbitMQ之TTL(Time-T...
  • RabbitMQ系列之死信队列
  • rabbitmq 死信队列使用方式 一.代码+配置 1.首先建立一个队列,标示为死信队列 Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare("some.exchange.name", "direct"); Map args
  • Rabbitmq 的死消息队列的坑 默认消息异常之后,都会往死消息队列里面写,然而异常是放到一个header里面去的。默认消息队列支持的最大frame_max 是128kb,超过这个大小,服务器就主动给你关闭连接,然后把你的消息会不断的重试。建议生产情况不要使用队列,或者是重写死队列的发布,不把堆栈放到header去。...
  • Rabbitmq消费失败死信队列 Rabbitmq 重消费处理一 处理流程图: 业务交换机:正常接收发送者,发送过来的消息,交换机类型topicAE交换机: 当业务交换机无法根据指定的routingkey去路由到队列的时候,会全部发送到AE交换机.发送到此队列的消息属于,业务垃圾消息,或者攻击消息类型,交换机类型fanout死信交换机:用于处理消费者,消费失败回退的消息,根据死信交换机的routingkey发送到死信队列,交换
  • 用rebbitMq来实现你的延迟队列功能 延迟队列在我们的上一篇文章使用delayedQueue实现你本地的延迟队列 中提到了延迟队列的作用. 但是我们知道,利用delayedQueue实现的是一个单机的,而且是内存中的延迟队列,他并没有一个集群的支持,并且需要在对泵机的时候,消息消费异常的时候做相应的逻辑处理。 那么这样做的话,我们需要的工作量还是很大的,有没有什么东西是让我们不做这一部分的工作也能实现延迟队列的功能? 当然有了。
  • rabbitmq 实现延迟队列(ttl+DLX) 实现原理利用死信队列加上生存时间,让信息在ttl完毕后到达指定队列. 所用到队列2个,一个是具有死信功能携带ttl属性的队列routingkey绑定到正常的队列里面.Rabbitmq 设置 发送消息到hello_delay里面,然后消费者监听hello队列.## 生产者 ##import pikacredentials = pika.PlainCredentials("michael","mic
  • php rabbitmq延迟队列示例 Python示例请移步 官方有关于延迟队列的插件,可以更灵活的设置延迟队列<?php /** * Created by PhpStorm. * User: he * Date: 17-7-17 * Time: 下午5:38 */namespace AcmeBundle\Service; use PhpAmqpLib\Connection\AMQPStreamConnection; use
Global site tag (gtag.js) - Google Analytics