Rabbitmq的死信】的更多相关文章

RabbitMQ死信队列 场景说明 代码实现 简单的Util 生产者 消费者 场景说明 场景: 当队列的消息未正常被消费时,如何解决? 消息被拒绝并且不再重新投递 消息超过有效期 队列超载 方案: 未被消费的消息,可通过"死信队列"重新被消费 死信队列含义,发生以上情况时,该队列上的消息,可通过配置转发到死信队列,被重新消费 模拟实现: 1个生产者,2个交换机和队列(普通和死信),1个消费者(死信消费者) 通过消息超时,模拟未正常消费场景 启动死信队列消费者,等待消息... 启动生产者…
死信队列 消息传输过程中难免会产生一些无法及时处理的消息,这些暂时无法处理的消息有时候也是需要被保留下来的,于是这些无法被及时处理的消息就变成了死信. 既然需要保留这些死信,那么就需要一个容器来存储它们以便后续需要时将它们取出来进行处理,于是就有了死信队列. 在RabbitMQ中当一个消息变成死信后会被重新发送到一个死信交换机(DLXs)中,当下列情况发生时队列中的消息会变成死信: 1:当消费端使用手动ack时,requeue属性为false时,消息被拒绝(basic.reject, basic…
一.概述 死信有死信队列.死信交换器和死信消息组成.死信消息则有如下三种情况生成: 1.消费者使用basic.reject或 basic.nack并将requeue参数设置为false来拒绝该消息 2.消息设置了TTL过期时间,过期时间内没有消费导致过期 3.消息因超过队列长度导致被丢弃 如果队列删除或者队列的TTL过期时间到了被删除其中的消息是不会成为死信消息的. 每个队列可通过队列参数arg或者策略policy设置死信交换器和死信路由键来处理死信消息,当队列参数与策略都有设置时,以队列参数设…
1:何为死信队列 死信队列也是一个正常的队列,可以被消费. 但是,死信队列的消息来源于其他队列的转发. 2:如何触发死信队列 1:消息超时 2:队列长度达到极限 3:消息被拒绝消费,并不再重进队列,且reQueue = false 需要在消费者的 arguments 中配置死信队列,配置为: "x-dead-letter-exchange":"自定义的交换机名称" 3:在Java中实例死信队列 3.1:生产者代码 3.2:消费者代码 4:测试效果 4.1:打开Rab…
前言 在业务开发过程中,我们常常需要做一些定时任务,这些任务一般用来做监控或者清理任务,比如在订单的业务场景中,用户在创建订单后一段时间内,没有完成支付,系统将自动取消该订单,并将库存返回到商品中,又比如在微信中,用户发出红包24小时后,需要对红包进行检查,是否已领取完成,如未领取完成,将剩余金额退回到发送者钱包中,同时销毁该红包. 在项目初始阶段,或者是一些小型的项目中,常常采用定时轮询的方法进行检查,但是我们都知道,定时轮询将给数据库带来不小的压力,而且定时间隔无法进行动态调整,特别是一个系…
本文口味:爆炒鱿鱼   预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我现在所在公司[手动滑稽]). 为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中.但由于对死信队列的概念及配置不熟悉,导致曾一度陷入百度的汪洋大海,无法自拔,很多文章都看起来可行,但是实际上却并不能帮我解决实际问题.最终,在官网文档…
参数中的 arguments 之前讲参数的一些作用的时候,忽略了最后一个字典类型的参数,因为这个参数是大有文章的,值得单独进出来说道说道. 这时,就不得不打开我们的 Web UI管理系统了,可以看到在这边添加queue的时候,有Arguments下面有一些说明,Message TTL,Auto expire--. Message TTL 可以看到,点击一下Message TTL,它的参数名是 x-message-ttl 类型是number,那么这个应该怎么用呢? 一起来看看官方解释,嗯...其实…
Spring AMQP中文文档 http://ju.outofmemory.cn/entry/320538 云栖社区    https://yq.aliyun.com/search?q=rabbitmq&type=ARTICLE RabbitMQ-JAVA常见报错信息 , https://yq.aliyun.com/articles/175024CentOS7环境下安装RabbitMQ, http://t.cn/RCtrQeyRabbitMQ-Java版本生产与消费, http://t.cn/R…
1.Message TTL message在队列queue中可以存活多长时间,以毫秒为单位:发布的消息在queue时间超过了你设定的时间就会被删除掉. channel.queueDeclare("test", true, false, false, new HashMap<String, Object>()); 2.Auto expire auto expire  设置当前的queue在指定的时间内,没有consumer.basic.get也就是未被访问,就会被删除. 3.…
  参数中的 arguments 之前讲参数的一些作用的时候,忽略了最后一个字典类型的参数,因为这个参数是大有文章的,值得单独进出来说道说道. 这时,就不得不打开我们的 Web UI管理系统了,可以看到在这边添加queue的时候,有Arguments下面有一些说明,Message TTL,Auto expire……. Message TTL 可以看到,点击一下Message TTL,它的参数名是 x-message-ttl 类型是number,那么这个应该怎么用呢? 一起来看看官方解释,嗯...…
概述 曾经去网易面试的时候,面试官问了我一个问题,说 下完订单后,如果用户未支付,需要取消订单,可以怎么做 我当时的回答是,用定时任务扫描DB表即可.面试官不是很满意,提出: 用定时任务无法做到准实时通知,有没有其他办法? 我当时的回答是: 可以用队列,订单下完后,发送一个消息到队列里,并指定过期时间,时间一到,执行回调接口. 面试官听完后,就不再问了.其实我当时的思路是对的,只不过讲的不是很专业而已.专业说法是利用延迟消息. 其实用定时任务,确实有点问题,原本业务系统希望10分钟后,如果订单未…
背景 工作中经常会有定时任务的需求,常见的做法可以使用Timer.Quartz.Hangfire等组件,这次想尝试下新的思路,使用RabbitMQ死信队列的机制来实现定时任务,同时帮助再次了解RabbitMQ的死信队列. 交互流程 1. 用户创建定时任务 2. 往死信队列插入一条消息,并设置过期时间为首个任务执行时间 3. 死信队列中的消息过期后,消息流向工作队列 4. 任务执行消费者监听工作队列,工作队列向消费者推送消息 5. 消费者查询数据库,读取任务信息 6. 消费者确认任务有效(未被撤销…
本文口味:鱼香肉丝   预计阅读:10分钟 一.说明 在上一篇中,介绍了RabbitMQ中的死信队列是什么,何时使用以及如何使用RabbitMQ的死信队列.相信通过上一篇的学习,对于死信队列已经有了更多的了解,这一篇的内容也跟死信队列息息相关,如果你还不了解死信队列,那么建议你先进行上一篇文章的阅读. 这一篇里,我们将继续介绍RabbitMQ的高级特性,通过本篇的学习,你将收获: 什么是延时队列 延时队列使用场景 RabbitMQ中的TTL 如何利用RabbitMQ来实现延时队列 二.本文大纲…
前言 上一篇消息中间件--RabbitMQ(七)高级特性全在这里!(上)中我们介绍了消息如何保障100%的投递成功?,幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费的问题?,Confirm确认消息.Return返回消息.这篇我们来介绍下下面内容. 自定义消费者 消息的限流(防止占用内存过多,节点宕机) 消息的ACK与重回队列 TTL消息 死信队列 1. 自定义消费者 1.1 消费端自定义监听 我们一般就在代码中编写while循环,进行consumer.nextDelivery…
RabbitMQ之备份交换机(alternate-exchange) 1.备份交换器,AlternateExchange(AE) 备份交换器是为了实现没有路由到队列的消息,声明交换机的时候添加属性alternate-exchange,声明一个备用交换机,一般声明为fanout类型,这样交换机收到路由不到队列的消息就会发送到备用交换机绑定的队列中. 使用Python的pika包,设置方式是在声明exchange时,argument的参数中设置alternate-exchange的值,值为备份交换机…
1.RabbitMQ中的消息如何保障百分之百的投递成功? 答:百分之百的投递成功,方案可以参考下面的2.3. 2.什么是生产者端的可靠性投递? 答:第一步,生产者保障消息的成功发出.第二步,保障RabbitMQ的节点成功接收到生产者发送的消息.第三步,发送端收到RabbitMQ节点(即Broker)确认应答.第四步,完善的消息进行补偿机制. 3.如何实现生产端的可靠性投递,解决方案,如下所示. 答:第一种,消息落库,对消息状态进行打标.意思是发送消息的时候,将消息持久化到数据库中,将消息设置一个…
    1.了解 MQ 的本质和 RabbitMQ 的特性: 2.掌握 RabbitMQ 的 Java API 编程和 Spring 集成 RabbitMQ 1. MQ 了解 1.1. 消息队列简介 1.1.1.MQ 的诞生历程 我们要去用 MQ,先来了解一下 MQ 是怎么诞生的,这样对于它解决了什么问题理解会更加深刻.世界上第一个 MQ 叫什么名字,是什么时候诞生的? 1983 年的时候,有个在 MIT 工作的印度小伙突发奇想,以前我们的软件相互通信,都是点对点的,而且要实现相同的协议,能不能…
原文链接:要做重试机制,就只能选择 DelayQueue ?其实 RabbitMQ 它上它也行! 一.场景 最近研发一个新功能,后台天气预警:后台启动一条线程,定时调用天气预警 API,查询现有城市的相关天气预警信息,如果发现有预警或取消预警的信息,给指定预警部门配置的相关人员发送短信:而如果第一次发送失败,我们需要隔几分钟再重新发送,最多可以重发5次. 二.技术选型 1.JDK 原生 DelayQueue: 重试机制最简单的就是直接利用 JDK 提供的 DelayQyeye,而 DelayQu…
上一篇 RabbitMQ 入门之基础概念 介绍了 RabbitMQ 的一些基础概念,本文再来介绍其中的一些细节和其它的进阶的概念. 一.消息生产者发送的消息不可达时如何处理 RabbitMQ 提供了消息在传递过程中无法发送到一个队列(比如根据自己的类型和路由键没有找到匹配的队列)时将消息回传给消息发送方的功能,使用 RabbitMQ 的客户端提供 channel.basicPublish 方法的两个参数 mandatory 和 immediate (RabbitMQ 3.0 以下版本),除此之外…
背景 本公司是.Net项目,在.Net可选的MQ比较少,主要Kafka和RabbitMQ,RabbitMQ我也是使用多年了,最近的Kafka广告与流行度打得使我也是无法无视,因此也是花了点时间收集了资料做了些对比. 此外有个小插曲,当我形成了文档让老板兼CTO对比决策后,他打算上阿里云买MQ服务.我当时给他开了个玩笑:您这价钱把我请回来,而且公司还有运维,其实完全可以自己维护,要不我来负责,你把这每个月的MQ费用给我加工资得了.当我下楼买了支维他柠檬茶后,他决定由我们自己搭建RabbitMQ.这…
1. 为什么你们公司选择RabbitMQ作为消息中间件 在消息队列选型时,我们调研了市场上比较常用ActiveMQ,RabbitMQ,RocketMQ,Kafka. RabbitMQ相对成熟稳定,这是我们选择它最主要的原因. 社区比较活跃,有完善的资料可以参考. Rabbitmq的吞吐量可以达到万级,完全满足我们系统的要求. RabbitMQ是Erlang语言开发的,性能比较好. 有完善的可视化界面,方便查看. 2. 消息队列的优点和缺点有哪些 优点有: 异步处理 - 相比于传统的串行.并行方式…
承接上文基于redis,redisson的延迟队列实践,今天介绍下基于rabbitmq延迟插件rabbitmq_delayed_message_exchange实现延迟任务. 一.延迟任务的使用场景 1.下单成功,30分钟未支付.支付超时,自动取消订单 2.订单签收,签收后7天未进行评价.订单超时未评价,系统默认好评 3.下单成功,商家5分钟未接单,订单取消 4.配送超时,推送短信提醒 5.三天会员试用期,三天到期后准时准点通知用户,试用产品到期了 ...... 对于延时比较长的场景.实时性不高…
什么是延迟队列 延迟队列存储的对象肯定是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行一场处理.这是就可以使用延迟队列将订单信息发送到延迟队列. 场景二:用户希望通过手机远程遥控家里的智能设备在指定的时间进行工作.这时候就可以将用户指令发送到延迟队列,当指令设定的时间到了再将指令推送到…
rocketmq  的延时消息不能支持任意延时,她定义了18 个延时等级,并且我们可以指定这18 个延时等级的延时时间. 发送消息的时候只需在消息中指定 当前消息的 延时等级即可,并且这个延时消息不是立刻翻到目标消息队列的,rocketmq 定义了 18 个 不可见的 队列,延时消息都放在这里面(有点像  rabbitmq 的 死信队列),当这个消息延时到了以后才投递给正常队列. java 代码例子: 修改 18 个默认延时等级例子.…
开篇 说到消息队列,相信大家并不陌生.大家在日常的工作中其实都有用过.相信大部分的研发在使用消息队列的过程中也仅仅是停留在用上面,里面的知识点掌握得并不是很系统,有部分强大的功能可能由于本身公司的业务形态或者业务量级的原因根本无法触及到.老猫在工作中就是如此,所使用的MQ都是架构师封装好的,简单调用即可.为了更好地了解其所以然,所以老猫就花时间好好梳理了一下MQ的一系列的知识点,俗话说"好记心不如烂笔头",所以老猫在学习的过程中就记录了下来.分享出来给有需要的小伙伴,当然也方便后续自己…
日前拜读阿牛老师的大作 领导:谁再用定时任务实现关闭订单,立马滚蛋! 发现其方案有若干瑕疵,特此抛砖引玉讨论一二. 在电商.支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝.某东都有这样的逻辑,而且时间很准确,误差在1s内:那他们是怎么实现的呢? 一般实现的方法有几种: 使用 rocketmq.rabbitmq.pulsar 等消息队列的延时投递功能 使用 redisson 提供的 DelayedQueue 有一些方案虽然广…
基于队列和基于消息的TTL TTL是time to live 的简称,顾名思义指的是消息的存活时间.rabbitMq可以从两种维度设置消息过期时间,分别是队列和消息本身. 队列消息过期时间-Per-Queue Message TTL: 通过设置队列的x-message-ttl参数来设置指定队列上消息的存活时间,其值是一个非负整数,单位为微秒.不同队列的过期时间互相之间没有影响,即使是对于同一条消息.队列中的消息存在队列中的时间超过过期时间则成为死信. 死信交换机DLX 队列中的消息在以下三种情况…
package com.hs.services.config; import java.util.HashMap; import java.util.Map; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springf…
  来自一个队列的消息可以被当做‘死信’,即被重新发布到另外一个“exchange”去,这样的情况有: 消息被拒绝 (basic.reject or basic.nack) 且带 requeue=false 参数 消息的TTL-存活时间已经过期 队列长度限制被超越(队列满)   Dead letter exchanges (DLXs) are normal exchanges.   For any given queue, a DLX can be defined by clients usin…
死信,顾名思义,就是死掉的消息,死掉的消息是会被一般的队列丢弃的.如果这些消息很重要,而我们又需要,怎么办?凡事都有一个退路,现在就有一种方法可将这些死信消息存下来,那就是DLX(Dead Letter Exchanges).DLX是专门用来存储死信消息到指定队列中的一种交换机.需要在声明队列时指定DLX和死信存放队列的路由Key,因为RabbitMQ是通过Exchange去匹配路由key寻找队列的. 死信消息是怎么产生的呢? 1.消息被拒(basic.reject or basic.nack)…