码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。


    系列目录

    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万条数据以下适合应用。

    总结:

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

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

  • 相关阅读:
    STM32 TIM(四)编码器接口
    废水含镍如何处理
    【读书笔记】【More Effective C++】技术(Techniques,Idioms,Patterns)
    刚体动力学-牛顿欧拉方程(刚体旋转)
    Vscode配置C#编程环境(win10)
    coco数据集json文件转换成YOLO版的txt文件代码
    Apache虚拟主机企业应用
    Windows 服务器远程桌面不能复制粘贴的解决方法
    Flutter Image组件如何处理图片加载过程中的错误?
    如何注册国外邮箱并享受全球通信
  • 原文地址:https://www.cnblogs.com/cyq1162/p/16607941.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号