系列目录

RabbitMQ 入门系列:1、MQ的应用场景的选择与RabbitMQ安装。

RabbitMQ 入门系列:2、基础含义:链接、通道、队列、交换机。

RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。

RabbitMQ 入门系列:4、基础编码:官方SDK使用:链接创建、单例改造、发送消息、接收消息。

RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。

RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。

RabbitMQ 入门系列:7、保障消息:不重复消费:产生消息的唯一ID。

RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。

RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。

RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景。

前言:

延迟队列用于事件发生后间隔一段时间后需要做特定处理的场景,如:

1、电商支付系统中,用户下单后N分钟不支付,自动取消订单。
2、用户浏览商品长时间后还没下单,后续推送相关产品和优惠券。
3、用户注册或修改生日后:生日短信推送等。
4、7天后的自动确认收货等。。。
......

对于这类应用,用消息队列,对个别可能是合适的,但对整个系统应用而言,它是不靠谱的。

消息队列的核心应用,是保持内存的队列,不断的产生并不断的消耗,最佳状态的保持系统的稳定和流畅。

而延迟队列的核心,是积压消息,大量积压消息,这明显与消息队列的设计就不符合。

下面来看看网传用死信队列来实现延迟队列的方式

1、死信队列的概念:

1、默认队列的消息过期了,或是被拒约处理,系统就是直接丢弃掉的。

2、如果你不希望过期的消息,被系统直接丢弃,还想拿来二次处理,那么:

可以通过绑定另一个队列,并标识为“x-dead-letter-exchange”,

那么,原本要丢弃的消息,就都转发到这指定的队列中,这个接收丢弃信息的队列,就叫死信队列。

2、死信队列的编码:

using (var channel = Rabbit.Instance.DefaultConnection.CreateModel())
{
//定义普通队列来接收丢弃的信息
channel.QueueDeclare("dead"); IDictionary<string, object> dic2 = new Dictionary<string, object>();
dic2.Add("x-dead-letter-exchange", "");//使用默认交换机
dic2.Add("x-dead-letter-routing-key", "dead");//设置转移到的队列
dic2.Add("x-message-ttl", 6000);//设置过期时间
channel.QueueDeclare("sendtodead", arguments: dic2); channel.BasicPublish("", "sendtodead", false, null, Encoding.UTF8.GetBytes("6秒就过期了1。"));
channel.BasicPublish("", "sendtodead", false, null, Encoding.UTF8.GetBytes("6秒就过期了2。")); }

运行后,消息从sendtoddead队列6秒过期后,转移到dead队列。

3、死信队列它的适用场景:

1、队列有统一的过期时间,不能使用单个信息的过期时间:

因为MQ不扫整个队列,只扫描队列第1个,判断是否过期,因此要求先进队列的必须先过期。

2、过期时间应该较短(根据可能积压的数据考量时间,一个核心的考量数据量是:10万条-100万条),避免长时间积压数据

对于长时间不消费的,不应该存入MQ,毕竟MQ的核心是内存队列,而不是磁盘队列。

4、死信队列它为什么不适合当延时队列:

了解完死信队列,会发现,其实在一个系统中,仅有比如N分钟后要处理逻辑的场景,比较适合,

其它N天后要处理的,都不靠谱。

而你用了N分钟的场景,那其它场景你用不用?

用了,不靠谱!

不用,得用其它方案,方案会不会多样化,不方便管理?

总结:

1、如果非要用死信队列当延时队列,那么要建立很多个第N分钟过期的队列。

2、如果非要用死信队列当延时队列,那么下一篇介绍的官方的延时队列插件,会比死信队列更合适。

RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。的更多相关文章

  1. RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  2. RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  3. RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  4. RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  5. RabbitMQ 入门系列:3、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  6. RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  7. RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  8. RabbitMQ 入门系列:7、保障消息不重复消费:产生消息的唯一ID。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  9. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

随机推荐

  1. Python调用腾讯云API,实现人脸年龄变化

    网上看到了一个教程,调用腾讯云的人脸识别api和修改年龄api来实现模拟人物不同年龄的面貌 但是大多数教程的代码都是想同的,估计是抄袭哪个人的关键是执行不了 刚好周杰伦马上要发新专辑了,小改一下,拿杰 ...

  2. 关于一次Web线下面试的思考

    前言: 今天面试一家Web前端的公司,由于跟初筛的面试官关系挺好,按理来说我在第一次线上面试就应该被淘汰了(呜呜呜),接下来是线下面试,不出意外的话,我凉了.但是这些天的面试经验并非全无收获.我的线下 ...

  3. BUUCTF-FLAG

    FLAG 16进制打开没看到有什么东西,使用binwalk分离也没看到其他文件,猜测是否使用lsb隐写方式. StegSolve打开 可以看到是压缩包的文件头,save bin保存为zip文件解压 提 ...

  4. RocketMQ事务消息机制

    1.half消息对消费者不可见,用于确定MQ服务正常. 2.MQ响应half消息. 3.生产者执行本地事务. 4.生产者发送具体消息+本地事务状态,MQ根据本地事务状态执行Commit或者Rollba ...

  5. React技巧之发出http请求

    原文链接:https://bobbyhadz.com/blog/react-send-request-on-click 作者:Borislav Hadzhiev 正文从这开始~ 总览 在React中, ...

  6. CMU15445 之 Project#0 - C++ Primer 详解

    前言 这个实验主要用来测试大家对现代 C++ 的掌握程度,实验要求如下: 简单翻译一下上述要求,就是我们需要实现定义在 src/include/primer/p0_starter.h 中的三个类 Ma ...

  7. 循环结构-for循环和while循环

    循环语句1--for for循环语句格式: for(初始化表达式①; 布尔表达式②; 步进表达式④){ 循环体③ } 执行流程 执行顺序:①②③④>②③④>②③④-②不满足为止. ①负责完 ...

  8. 关于 Flink 状态与容错机制

    Flink 作为新一代基于事件流的.真正意义上的流批一体的大数据处理引擎,正在逐渐得到广大开发者们的青睐.就从我自身的视角看,最近也是在数据团队把一些原本由 Flume.SparkStreaming. ...

  9. 基于CentOS的IB网卡驱动安装

    一.准备步骤 1.查看centos版本 cat /etc/issue或者cat /etc/redhat-release  2.查看linux版本 cat /proc/version或uname -a或 ...

  10. linux常用命令和快捷键收集

    find / -name php #查找根目录下所有包含 php 字符的文件和目录 find / -ctime 1 #查找最近一天下载的文件和目录 yum install lrzsz #安装上传下载组 ...