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

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

时间:2022-09-01 12:22:51浏览次数:91  
标签:插件 系列 入门 队列 RabbitMQ dead 延时

系列目录

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、下载地址:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

 

 

2、解压到RabbitMQ安装目录下的plugins目录下 

 

3、启动:命令行运行以下命令:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

 

4、重启RabbitMQ:

 

多了个x-delayed-message则为安装成功。

2、延时队列插件:实现原理

3、延时队列插件:编码实现

其实,队列一直还是那个普通的队列,只是多了一个交换机的类型是延时类型。

因此,原理就是把消息,设置过期时间,发给延时交换机,它自己存着,到时间了,会转发到队列去。

代码如下:

using (var channel = Rabbit.Instance.DefaultConnection.CreateModel())
{

    //定义队列
    channel.QueueDeclare("dead");
   
   //定义延时路由 IDictionary<string, object> dic = new Dictionary<string, object>(); dic.Add("x-delayed-type", "direct"); channel.ExchangeDeclare("ex-dead", "x-delayed-message", arguments: dic);
channel.QueueBind("dead", "ex-dead", "dead"); var p1 = channel.CreateBasicProperties(); IDictionary<string, object> header = new Dictionary<string, object>(); header.Add("x-delay", 6000); p1.Headers = header; var p2 = channel.CreateBasicProperties(); IDictionary<string, object> header2 = new Dictionary<string, object>(); header2.Add("x-delay", 16000); p2.Headers = header2; channel.BasicPublish("ex-dead", "dead", false, p1, Encoding.UTF8.GetBytes("6秒就过期了1。")); channel.BasicPublish("ex-dead", "dead", false, p2, Encoding.UTF8.GetBytes("16秒就过期了2。")); }

运行,等了16秒,终于等来了数据:

 

4、延时队列插件:适合应用场景

如果说,列信队列的适合场景,是短时间的固定间隔时间。

那么说,延时队列插件的适合场景,就是更进一步的短时间内的随机时间。

划重点的话,还是取决于积压的数据量。

官方的吐槽说明,目前的设计,由于存储数据库设计不佳,该插件推荐积压数据在100万条数据以下适合应用。

总结:

使用延时队列,应该考量业务积压的数据量,如果数据量小,那么都不是问题。

如果数据量大,那么建立队列数据库,按时间存档要发送的数据,定时扫描处理更合适。 

标签:插件,系列,入门,队列,RabbitMQ,dead,延时
From: https://www.cnblogs.com/cyq1162/p/16607941.html

相关文章

  • 【转载】aio系列文档(2)----图解bytebuffer
    aio系列文档(2)----图解bytebuffer 收藏原作者: talent-tan因何而写网上关于bytebuffer的文章真的很多,为何在此还要写一篇呢?主要是基于以下几点考虑很多人......
  • Python入门系列(七)开发常说的“累”与“对象”
    类与对象Python是一种面向对象的编程语言。要创建类,请使用关键字classclassMyClass:x=5创建一个名为p1的对象,并打印x的值p1=MyClass()print(p1.x)所有类......
  • 算法与数据结构系列
    算法与数据结构系列从零到英雄的算法和数据结构这是算法和数据结构系列从零到英雄的目录。BigO表示法数据结构数组和字符串链表堆栈尾巴树木图表算法选择......
  • 轻量级消息队列 Django-Q 轻度体验
    前言最近做的这个项目(基于Django),需要做个功能,实现定时采集车辆定位。这让我想起来几年前那个OneCat项目,当时我用的是Celery这个很重的组件Celery实在是太重了,后来我做公......
  • 优先队列(priority_queue)
    介绍:STL中的优先队列本质上就是基于堆实现的,所以可以实现堆的很多操作。优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序头文件:#include<qu......
  • Python入门系列(六)一篇学会python函数
    函数函数是只在调用时运行的代码块。defmy_function():print("Hellofromafunction")my_function()信息可以作为参数传递到函数中。defmy_function(fname):......
  • 延迟消息队列beanstalkd
    beanstalkd是简单、快速的工作队列!Beanstalkd安装安装它的v1.12版本。[root@2207011resource]#wgethttps://github.com/beanstalkd/beanstalkd/archive/refs/tags/v......
  • Yolo系列简单汇总二(yolox yolo6 yolo7)
    Yolo系列简单汇总一(yolov1至yolov5)见:https://www.cnblogs.com/xiaxuexiaoab/p/16615242.html六、YoloXpdf:https://arxiv.org/pdf/2107.08430.pdfcode:https://git......
  • Yolo系列简单汇总一(yolov1至yolov5)
    Yolo系列简单汇总二(yoloxyolo6yolo7)见:https://www.cnblogs.com/xiaxuexiaoab/p/16643821.html一、YoloV1pdf:https://arxiv.org/pdf/1506.02640.pdfcode:https://......
  • RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。
    系列目录RabbitMQ入门系列:1、MQ的应用场景的选择与RabbitMQ安装。RabbitMQ入门系列:2、基础含义:链接、通道、队列、交换机。RabbitMQ入门系列:3、基础含义:持久化、......