前言:
当前你们对“延时加载插件”大概比较关心,小伙伴们都需要知道一些“延时加载插件”的相关内容。那么小编同时在网摘上网罗了一些有关“延时加载插件””的相关知识,希望姐妹们能喜欢,大家一起来学习一下吧!前言:
延迟队列用于事件发生后间隔一段时间后需要做特定处理的场景,如:
1、电商支付系统中,用户下单后N分钟不支付,自动取消订单。2、用户浏览商品长时间后还没下单,后续推送相关产品和优惠券。3、用户注册或修改生日后:生日短信推送等。4、7天后的自动确认收货等。。。......
对于这类应用,其实用消息队列,对个要求要求,是合适的,但对整个系统应用而言,它是不靠谱的。
消息队列的核心应用,是保持内存的队列,不断的产生并不断的消耗,最佳状态的保持系统的稳定和流畅。
而延迟队列的核心,是积压消息,还是大量积压,这明显与消息队列的设计就不符合。
下面来看看网上官方的延时队列插入:
1、延时队列插件:下载解压与启用
1、下载地址:
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万条数据以下适合应用。
总结:
使用延时队列,应该考量业务积压的数据量,如果数据量小,那么都不是问题。
如果数据量大,那么建立队列数据库,按时间存档要发送的数据,定时扫描处理更合适。
标签: #延时加载插件