Rabbitmq消费失败死信队列
Rabbitmq 重消费处理
一 处理流程图:
业务交换机:正常接收发送者,发送过来的消息,交换机类型topic
AE交换机: 当业务交换机无法根据指定的routingkey去路由到队列的时候,会全部发送到AE交换机.发送到此队列的消息属于,业务垃圾消息,或者攻击消息类型,交换机类型fanout
死信交换机:用于处理消费者,消费失败回退的消息,根据死信交换机的routingkey发送到死信队列,交换机类型 topic
EXAMPLE:
业务routingkey: hello/task_queue
生产者发送routingkey: hello task_queue michael
最后业务交换机根据routingkey 会把匹配 hello 和task_queue的发送到业务队列1和业务队列2,michael routingkey没匹配,直接发送到AE交换机,AE交换机的类型为fanout,直接到了告警队列里面,这时候就说明,生产者有问题,或者有一些非法生产者在猜测routingkey,这时候就可以告警处理.
当正常的消息到了业务队列后,消费者监听这个队列进行处理,在消费者处理的过程中,难免会有一些消息处理失败,因为业务的种种原因,但是这些消息一旦失败,那么就会影响性能和后面的消息的消费,这时候就需要一个死信队列,来存放这个消费不了的消息,进入死信队列后,在进行其他处理.
消息消费失败处理方式:
一 进入死信队列(进入死信的三种方式)
1.消息被拒绝(basic.reject or basic.nack)并且requeue=false
2.消息TTL过期
3.队列达到最大长度
二 重新发布此消息到对应的队列(low)
二 处理案例
基础设置:
业务交换机设置:
设置AE交换机为alter
绑定routingkey到对应的队列
AE交换机设置,设置为internal,表示内部EXchange到EXchange,绑定需要接受的队列alter_message
三个队列都属于常规的队列,其中task_queue业务比较重要,当消费者消费失败的时候要回退到死信队列在进行处理!
Task_queue设置
设置:x-dead-letter-exchange 指定死信送往的交换机
设置:x-dead-letter-routing-key 指定死信的routingkey
(我在消费者处理失败的时候已经修改好了routingkey)
死信队列设置:因为是队列到exchange的所以不能把交换机设置成internal,设置匹配的routingkey,表示消费失败的消息队列,最好可以一眼看出,是什么队列消费失败,所以我这里设置了queue_name.fail
下面开始消息发送和观察现象:
我定义发送的消息和routingkey是一致的,这里我发送了三条消息,其中有两条设置了routingkey,另外一条没做routingkey.
可以看到匹配到routingkey的消息已经进入到了匹配的队列,没有匹配到的消息也就是michael,直接进入了告警队列.
我这里打印的信息很多,但是可以看到hello这条消息时成功的被获取到和被消费掉了.
针对task_queue我做了特殊处理,匹配到了消息时task_queue就直接进入到死信队列里面,在程序里面消费的时候,可以捕获expection 然后进行退信处理.我这里用的是basic.reject和requeue=false进行处理的!
进过处理后可以看到task_queue的消息已经进入到了死亡队列里面,这样对于消费失败的消息,存放死信队列就成功了,
下面就是进入死信队列的消息,可以看到routingkey已经按照我们设置的
还有queue从哪个队列进来的和原始的routingkey还有一个就是reason表明消息时rejected.
可以看到在警告队里里面的消息michael.
所有所设置的功能已经实现!
---------------------
作者:Michael_曾浩
来源:CSDN
原文:https://blog.csdn.net/qq_29778131/article/details/52536965
版权声明:本文为博主原创文章,转载请附上博文链接!
Rabbitmq消费失败死信队列的更多相关文章
- 关于 RabbitMQ 的 Dead-Letters-Queue “死信队列”
来自一个队列的消息可以被当做‘死信’,即被重新发布到另外一个“exchange”去,这样的情况有: 消息被拒绝 (basic.reject or basic.nack) 且带 requeue=fa ...
- RabbitMQ TTL、死信队列
TTL概念 TTL是Time To Live的缩写,也就是生存时间. RabbitMQ支持消息的过期时间,在消息发送时可以进行指定. RabbitMQ支持队列的过期时间,从消息入队列开始计算,只要超过 ...
- RabbitMQ (五):死信队列
什么是TTL RabbitMQ的TTL全称为Time-To-Live,表示的是消息的有效期.消息如果在队列中一直没有被消费并且存在时间超过了TTL,消息就会变成了"死信" (Dea ...
- RabbitMQ死信队列
关于RabbitMQ死信队列 死信队列 听上去像 消息“死”了 其实也有点这个意思,死信队列 是 当消息在一个队列 因为下列原因: 消息被拒绝(basic.reject/ basic.nac ...
- 【MQ中间件】RabbitMQ -- RabbitMQ死信队列及内存监控(4)
1.RabbitMQ TTL及死信队列 1.1.TTL概述 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取:过了之后消息将自动被删除.RabbitMQ可以对消息和队列设 ...
- SpringCloud 2020.0.4 系列之 Stream 消息出错重试 与 死信队列 的实现
1. 概述 老话说的好:出错不怕,怕的是出了错,却不去改正.如果屡次出错,无法改对,就先记下了,然后找援军解决. 言归正传,今天来聊一下 Stream 组件的 出错重试 和 死信队列. RabbitM ...
- Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
应用场景 前两天我们已经介绍了两种Spring Cloud Stream对消息失败的处理策略: 自动重试:对于一些因环境原因(如:网络抖动等不稳定因素)引发的问题可以起到比较好的作用,提高消息处理的成 ...
- RabbitMQ 消费端限流、TTL、死信队列
目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...
- rabbitmq~消息失败后重试达到 TTL放到死信队列(事务型消息补偿机制)
这是一个基于消息的分布式事务的一部分,主要通过消息来实现,生产者把消息发到队列后,由消费方去执行剩下的逻辑,而当消费方处理失败后,我们需要进行重试,即为了最现数据的最终一致性,在rabbitmq里,它 ...
随机推荐
- 配置HADOOP_HOME
配置HADOOP_HOME export HADOOP_HOME=/usr/hadoop-1.2.0export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sb ...
- ToString(string format)输出格式简述
ToString说明 ToString 是 .NET Framework 中主要的格式化方法.它将对象转换为其字符串表现形式,使它适合于显示.(有关对 .NET Framework 中的格式设置支持的 ...
- 内核交互--debugfs_转
转载:Linux内核里的DebugFS DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据.类似的虚拟文件系统还有procfs和sysfs等,这 ...
- php 使用curl 将文件上传
<?php /** * curl文件上传 * @var struing $r_file 上传文件的路劲和文件名 */ function upload_file($r_f ...
- web安全漏洞防护
Password type input with autocomplete enabled The autocomplete attribute works with the following &l ...
- iOS View生成--->清晰的图片
核心代码 view生成图片方法 UIGraphicsBeginImageContext(view.bounds.size); [view.layer renderInContext:UIGraphic ...
- go语言获取字符串元素的个数
1:获取字符串字节的个数,并按字节挨个输出 package main import ( "fmt" ) func main() { var str string = "a ...
- final和finally面试时最好的回答
finally: try块必须和catch块或和finally同在,不能单独存在,二者必须出现一个. finally块总会执行,不论是否有错误出现.但是若try语句块或会执行的catch语句块使用了J ...
- PMP杂谈--项目组织,矩阵组织,职能型组织,复合型组织
(1)项目组织的优缺点:优:项目经理权力大:缺:解散时焦虑.没有提拔权力,不利于专业技术积累,设备反复.难以保证资源的充分利用. (2)矩阵组织的优缺点:优:资源利用率高,横向信息沟通.项目经理权力提 ...
- golang 模板(template)的常用基本语法
1. 模板 在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页,golang提供了html/template包来支持模板渲染. 这篇文章不讨论gola ...