ruoyi-vue-pro 开发指南 ruoyi-vue-pro 开发指南
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 商城手册
  • 公众号手册
  • 系统手册
  • 运维手册
  • 前端手册 Vue 2.x
  • 前端手册 Vue 3.x
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 商城手册
  • 公众号手册
  • 系统手册
视频教程
  • Vue3 + element-plus (opens new window)
  • Vue3 + vben(ant-design-vue) (opens new window)
  • Vue2 + element-ui (opens new window)
微服务版 (opens new window)
作者博客 (opens new window)
GitHub (opens new window)
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 商城手册
  • 公众号手册
  • 系统手册
  • 运维手册
  • 前端手册 Vue 2.x
  • 前端手册 Vue 3.x
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 商城手册
  • 公众号手册
  • 系统手册
视频教程
  • Vue3 + element-plus (opens new window)
  • Vue3 + vben(ant-design-vue) (opens new window)
  • Vue2 + element-ui (opens new window)
微服务版 (opens new window)
作者博客 (opens new window)
GitHub (opens new window)
  • 萌新必读

    • 简介
    • 交流群
    • 视频教程
    • 功能列表
    • 快速启动(适合“后端”工程师)
    • 快速启动(适合“前端”工程师)
    • 接口文档
    • 技术选型
    • 项目结构
    • 代码热加载
    • 一键改包
    • 删除功能
    • 内网穿透
  • 后端手册

    • 新建模块
    • 代码生成(新增功能)
    • 功能权限
    • 数据权限
    • 用户体系
    • 三方登录
    • OAuth 2.0(SSO 单点登录)
    • SaaS 多租户【字段隔离】
    • SaaS 多租户【数据库隔离】
    • 异常处理(错误码)
    • 参数校验
    • 分页实现
    • 文件存储(上传下载)
    • Excel 导入导出
    • 系统日志
    • MyBatis 数据库
    • MyBatis 联表&分页查询
    • 多数据源(读写分离)
    • Redis 缓存
    • 本地缓存
    • 异步任务
    • 配置管理
    • 工具类 Util
    • 单元测试
    • 分布式锁
    • 幂等性(防重复提交)
    • 数据库文档
    • 验证码
  • 中间件手册

    • 消息队列
      • 0. 消息队列的开启
      • 1. 集群消费
        • 1.1 使用场景
        • 1.2 实现源码
        • 1.3 实战案例
      • 2. 广播消费
        • 2.1 使用场景
        • 2.2 实现源码
        • 2.3 实战案例
    • 消息队列(内存)
    • 定时任务
    • 限流熔断
  • 工作流手册

    • 工作流(Flowable)会签、或签
  • 商城手册

    • 商城演示
    • 功能开启
  • 大屏手册

    • 报表设计器
    • 大屏设计器
  • 支付手册

    • 功能开启
    • 支付宝支付接入
    • 微信公众号支付接入
    • 微信小程序支付接入
    • 支付宝、微信退款接入
  • 公众号手册

    • 功能开启
    • 公众号接入
    • 公众号粉丝
    • 公众号标签
    • 公众号消息
    • 自动回复
    • 公众号菜单
    • 公众号素材
    • 公众号图文
    • 公众号统计
  • 系统手册

    • 短信配置
    • 邮件配置
    • 站内信配置
    • 数据脱敏
    • 敏感词
    • 地区 & IP 库
  • 运维手册

    • 开发环境
    • Linux 部署
    • Docker 部署
    • Jenkins 部署
    • HTTPS 证书
    • 服务监控
  • 前端手册 Vue 2.x

    • 开发规范
    • 菜单路由
    • Icon 图标
    • 字典数据
    • 系统组件
    • 通用方法
    • 配置读取
  • 前端手册 Vue 3.x

    • 开发规范
    • 菜单路由
    • Icon 图标
    • 字典数据
    • 系统组件
    • 通用方法
    • 配置读取
    • CRUD 组件
    • 国际化
    • IDE 调试
  • 更新日志

    • 【v1.9.0】开发中
    • 【v1.8.3】2023-10-24
    • 【v1.8.2】2023-09-24
    • 【v1.8.1】2023-09-04
    • 【v1.8.0】2023-07-27
    • 【v1.7.3】2023-05-29
    • 【v1.7.2】2023-04-19
  • 开发指南
  • 中间件手册
芋道源码
2022-04-03
目录

消息队列

yudao-spring-boot-starter-mq (opens new window) 技术组件,基于 Redis 实现分布式消息队列:

  • 使用 Stream (opens new window) 特性,提供【集群】消费的能力。
  • 使用 Pub/Sub (opens new window) 特性,提供【广播】消费的能力。

友情提示:

考虑到有部分同学对分布式消息队列了解的不多,所以在下文的广播消费、集群消费的描述,去除【消费者分组】的概念。如果你对这块感兴趣,可以看看艿艿写的系列文章:

  • 《芋道 Spring Boot 消息队列 RocketMQ 入门》 (opens new window) 对应 lab-31 (opens new window)
  • 《芋道 Spring Boot 消息队列 Kafka 入门》 (opens new window) 对应 lab-03-kafka (opens new window)
  • 《芋道 Spring Boot 消息队列 RabbitMQ 入门》 (opens new window) 对应 lab-04-rabbitmq (opens new window)
  • 《芋道 Spring Boot 消息队列 ActiveMQ 入门》 (opens new window) 对应 lab-32 (opens new window)

# 0. 消息队列的开启

消息队列默认是禁用状态,主要考虑一些团队可能不需要。如果你需要使用短信、邮箱等功能,需要进行开启。

通过修改 application.yaml 配置文件的 yudao.mq.redis.pubsub.enable 和 yudao.mq.redis.pubsub.enable 配置项目为 true 即可。如下图所示:

消息队列的开启

# 1. 集群消费

集群消费,是指消息发送到 Redis 时,有且只会被一个消费者(应用 JVM 实例)收到,然后消费成功。如下图所示:

集群消费

# 1.1 使用场景

集群消费在项目中的使用场景,主要是提供可靠的、可堆积的异步任务的能力。例如说:

  • 短信模块,使用它异步 (opens new window)发送短信。
  • 邮件模块,使用它异步 (opens new window)发送邮件。

相比 《开发指南 —— 异步任务》 来说,Spring Async 在 JVM 实例重启时,会导致未执行完的任务丢失。而集群消费,因为消息是存储在 Redis 中,所以不会存在该问题。

# 1.2 实现源码

集群消费基于 Redis Stream 实现:

  • 实现 AbstractStreamMessage (opens new window) 抽象类,定义【集群】消息。
  • 使用 RedisMQTemplate (opens new window) 的 #send(message) (opens new window) 方法,发送消息。
  • 实现 AbstractStreamMessageListener (opens new window) 接口,消费消息。

最终使用 YudaoMQAutoConfiguration (opens new window) 配置类,扫描所有的 AbstractStreamMessageListener 监听器,初始化对应的消费者。如下图所示:

YudaoMQAutoConfiguration

# 1.3 实战案例

以短信模块异步发送短息为例子,讲解集群消费的使用。

实战案例

# 1.3.1 引入依赖

在 yudao-module-system-biz 模块中,引入 yudao-spring-boot-starter-mq 技术组件。如下所示:

<dependency>
    <groupId>cn.iocoder.boot</groupId>
    <artifactId>yudao-spring-boot-starter-mq</artifactId>
</dependency>

# 1.3.2 SmsSendMessage

在 yudao-module-system-biz 的 mq/message/sms (opens new window) 包下,创建 SmsSendMessage (opens new window) 类,继承 AbstractStreamMessage 抽象类,短信发送消息。代码如下图:

SmsSendMessage

# 1.3.3 SmsProducer

① 在 yudao-module-system-biz 的 mq/producer/sms (opens new window) 包下,创建 SmsProducer (opens new window) 类,SmsSendMessage 的 Producer 生产者,核心是使用 RedisMQTemplate 发送 SmsSendMessage 消息。代码如下图:

SmsProducer

② 发送短信时,需要使用 SmsProducer 发送消息。如下图所示:

调用 SmsProducer 示例

# 1.3.4 SmsSendConsumer

在 yudao-module-system-biz 的 mq/consumer/sms (opens new window) 包下,创建 SmsSendConsumer (opens new window) 类,SmsSendMessage 的 Consumer 消费者。代码如下图:

SmsSendConsumer

# 2. 广播消费

广播消费,是指消息发送到 Redis 时,所有消费者(应用 JVM 实例)收到,然后消费成功。如下图所示:

集群消费

# 2.1 使用场景

例如说,在应用中,缓存了数据字典等配置表在内存中,可以通过 Redis 广播消费,实现每个应用节点都消费消息,刷新本地内存的缓存。

又例如说,我们基于 WebSocket 实现了 IM 聊天,在我们给用户主动发送消息时,因为我们不知道用户连接的是哪个提供 WebSocket 的应用,所以可以通过 Redis 广播消费。每个应用判断当前用户是否是和自己提供的 WebSocket 服务连接,如果是,则推送消息给用户。

# 2.2 实现源码

广播消费基于 Redis Pub/Sub 实现:

  • 实现 AbstractChannelMessage (opens new window) 抽象类,定义【广播】消息。
  • 使用 RedisMQTemplate (opens new window) 的 #send(message) (opens new window) 方法,发送消息。
  • 实现 AbstractChannelMessageListener (opens new window) 接口,消费消息。

最终使用 YudaoMQAutoConfiguration (opens new window) 配置类,扫描所有的 AbstractChannelMessageListener 监听器,初始化对应的消费者。如下图所示:

YudaoMQAutoConfiguration

# 2.3 实战案例

参见 《开发指南 —— 本地缓存》

验证码
消息队列(内存)

← 验证码 消息队列(内存)→

Theme by Vdoing | Copyright © 2019-2023 芋道源码 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×