当前位置: 首页 > news >正文

RabbitMQ如何实现延迟消息?

RabbitMQ中是可以实现延迟消息的,一般有两种方式,分别是通过死信队列以及通过延迟消息插件来实现。

扩展:

死信队列

当rabbitMQ中的一条正常的消息,因为过了存活时间(TTL过期),队列长度超限,被消费者拒绝等原因无法被消费时,就会变成Dead Message ,即死信。

当一个消息变成死信之后,他就能被重新发送到死信对列中(其实是交换机-exchange)。

那么基于这样的机制,就可以实现延迟消息了。那就是我们给一个消息设定TTL ,但是并不消费这个消息,等他过期,过期后就会进入到死信队列,然后我们再监听死信队列的消息就行了。

而且,rabbitMq中的这个ttl是可以设置任意时长的,这相比于RocketMQ只支持一些固定的时长而显得更加灵活一些。

但是,死信队列的实现方式存在一个问题,那就是可能造成队头阻塞,因为队列是先进先出的,而且每次只会判断队头的消息是否过期,那么如果队头的消息时间很长,一直都不过期,那么就会阻塞整个队列,这时候即便排在他后面的消息过期了,那么也会被一直阻塞。

基于RabbitMQ的死信队列,可以实现延迟消息,非常灵活的实现定时关单,并且借助RabbitMQ的集群扩展性,可以实现高可用,以及处理大并发。他的缺点第一是可能存在消息阻塞的问题,还有就是方案比较复杂,不仅要依赖RabbitMQ,而且还需要声明很多队列处理,增加系统的复杂度

RabbitMQ插件

其实,基于RabbitMQ的话,可以不用死信队列也能实现延迟消息,那就是基于  rabbitmq_delayed_message_exchange插件,这种方案能够解决通过死信队列实现延迟消息出现的消息阻塞问题,但是该插件从RabbitMQ的3.6.12开始支持的,所以有对版本有要求。

这个插件是官方出的,可以放心使用,安装并启用这个插件之后,就可以创建x-delayed-message类型的交换机了。

前面我们 提到的基于死信队列的方式,是消息先回投递到一个正常队列,在ttl过期后进入死信队列,但是基于插件这种方式,消息并不会立即进入队列,而是先把他保存在一个基于erlang开发的mnesia数据库中,然后通过一个定时器去查询需要被投递的消息,再把他们投递到x-delayd-message交换机中。

基于rabbitmq插件的方式可以实现延迟消息,并且不存在消息阻塞的问题,但是因为是基于插件的,而这个插件支持的最大延迟时间是(2^32)-1毫秒,大约49天,超过这个时间会被立即消费。

不过这个方案也有一定 限制,它将延迟消息存在于mbesia表中,并且在当前节点上具有单个磁盘副本,存在丢失的问题。

目前该插件的当前设计并不真正适合包含大量延迟消息(例如数十万或者百万)的场景,

http://www.lryc.cn/news/311781.html

相关文章:

  • Svg Flow Editor 原生svg流程图编辑器(一)
  • 头像剪切上传
  • 24计算机考研调剂 | 北京信息科技大学
  • 06 - 镜像管理
  • 最简单 导航栏 html css
  • PostgreSQL的学习心得和知识总结(一百三十一)|深入理解PostgreSQL数据库如何使用psql中的变量
  • 支付宝小程序模板开发,实现代小程序备案申请
  • 怎么培养孩子的学习习惯?
  • deeplearning with pytorch (三)
  • LLaMA模型的发布与创新潮流
  • Python之Web开发初学者教程—ubuntu中安装配置redis
  • 如何在Vue中进行单元测试?
  • 开源组件安全风险及应对
  • nginx出现 “414 request-uri too large”
  • 堆和二叉树的动态实现(C语言实现)
  • Vue前端+快速入门【详解】
  • day06_菜单管理(查询菜单,添加菜单,添加子菜单,修改菜单,删除菜单,角色分配菜单,查询菜单,保存菜单,动态菜单)
  • 探究与以太坊智能合约的交互
  • Windows如何安装docker-desktop
  • 芯片设计后端遇到的各种文件类型和文件后缀
  • 【Web】Java反序列化之CC7链——Hashtable
  • NumPy数据处理详解的笔记2
  • xsslabs第四关
  • Qt下使用modbus-c库实现PLC线圈/保持寄存器的读写
  • C++ 滑动窗口
  • 【深度学习】TensorFlow基础介绍
  • springcloud:3.3测试重试机制
  • 【笔记】【电子科大 离散数学】 3.谓词逻辑
  • 倍增算法C++
  • uniapp制作--进步器的选择