Skip to main content

07小节:RocketMQ5.x延时消息修改优惠券结束状态

作者:程序员马丁

在线博客:https://nageoffer.com

note

热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。

RocketMQ5.x延时消息修改优惠券结束状态,元数据信息:

©版权所有 - 拿个offer-开源&项目实战星球专属学习项目,依据《中华人民共和国著作权法实施条例》《知识星球产权保护》,严禁未经本项目原作者明确书面授权擅自分享至 GitHub、Gitee 等任何开放平台。违者将面临法律追究。


内容摘要:讲解什么是消息队列和什么是 RocketMQ,并说了消息队列常见的业务场景,使用 RocketMQ5.x 任意延时消息完成优惠券到期结束功能,其中有较多的细节,希望大家多多注意。

课程目录如下所示:

  • 业务背景
  • Git 分支
  • 消息队列介绍
  • RocketMQ 使用安装
  • RocketMQ 代码实战
  • 文末总结

业务背景

在之前的章节里,我们完成了优惠券模板的创建、结束等功能,但是还遗留了一个小功能,那就是如果说优惠券模板有效期结束了之后,我们的模板状态依然是生效中。基于这个功能点考虑,我们需要在定时任务和定时消息中进行选择,以此来满足精准关闭优惠券模板功能。

使用 RocketMQ 定时消息有如下优势:

  • 定时精度高、开发门槛低:消息定时时间不存在阶梯间隔,可以轻松实现任意精度事件触发,无需业务去重。
  • 高性能、可扩展:传统的定时实现方案较为复杂,需要进行数据库扫描,容易遇到性能瓶颈的问题,RocketMQ 可以基于定时消息特性完成事件驱动,实现百万级消息 TPS 能力。

RocketMQ5.x 之前仅支持固定延迟级别,5.x 之后支持了任意延时消息。使用定时任务也能够完成该功能,在这个小节里给大家演示消息队列延时,后面还有个类似的需求,使用 XXL-Job 完成。

使用消息队列时序图如下所示:

Git 分支

20240821_dev_coupon-template-close_rocketmq5_ding.ma

消息队列介绍

1. 什么是消息队列?

消息队列是一种用于异步通信的机制,允许不同的系统组件或服务之间交换信息。它的主要作用是将消息从发送者传递到接收者,同时解耦这两个组件的直接依赖。

2. 什么是 RocketMQ?

RocketMQ 是一个开源的分布式消息中间件,由阿里巴巴开发并贡献给 Apache 软件基金会。它主要用于高吞吐量、低延迟的消息传递需求。

RocketMQ 的优点和功能是比较多的,以下是 一些主要特点和功能:

  • 高吞吐量和低延迟:RocketMQ 设计用于处理大量的消息,并提供低延迟的消息传递服务,适合需要高性能的场景。

  • 分布式架构:RocketMQ 使用分布式架构来支持大规模的消息传递。它可以水平扩展,以处理更大的数据量和更高的并发需求。

  • 消息可靠性:RocketMQ 支持消息持久化和多副本机制,确保在系统故障时不会丢失消息。这使得消息的可靠性和一致性得到了保障。

  • 高可用性和容错:RocketMQ 提供了高可用性的解决方案,包括多主多从等架构方案,确保系统的稳定性和连续性。

官网写的很详细,架构、基本概念(主题、队列、生产者、消费者、NameServer、Beroker 等)、工作原理等。

推荐大家学习一波:https://rocketmq.apache.org/zh/docs

3. 消息队列都有哪些作用?

3.1 异步解耦

最常见的一个场景是用户注册后,需要发送注册邮件和短信通知,以告知用户注册成功。传统的做法有以下两种:

串行方式:

数据流动如下所述:

  1. 注册页面填写账号和密码并提交注册信息,这些注册信息首先会被写入注册系统。
  2. 注册信息写入注册系统成功后,再发送请求至邮件通知系统。邮件通知系统收到请求后向用户发送邮件通知。
  3. 邮件通知系统接收注册系统请求后再向下游的短信通知系统发送请求。短信通知系统收到请求后向用户发送短信通知。

以上三个任务全部完成后,才返回注册结果到客户端,用户才能使用账号登录。假设每个任务耗时分别为 50ms,则用户需要在注册页面等待总共 150ms 才能登录。

并行形式:

对于用户来说,注册功能实际只需要注册系统存储用户的账户信息后,该用户便可以登录,后续的注册短信和邮件不是即时需要关注的步骤。

对于注册系统而言,发送注册成功的短信和邮件通知并不一定要绑定在一起同步完成,所以实际当数据写入注册系统后,注册系统就可以把其他的操作放入对应的 RocketMQ 中然后马上返回用户结果,由 RocketMQ 异步地进行这些操作。

数据流动如下所述:

  1. 用户在注册页面填写账号和密码并提交注册信息,这些注册信息首先会被写入注册系统。
  2. 注册信息写入注册系统成功后,再发送消息至 RocketMQ。 RocketMQ 会马上返回响应给注册系统,注册完成。用户可立即登录。
  3. 下游的邮件和短信通知系统订阅 RocketMQ 的此类注册请求消息,即可向用户发送邮件和短信通知,完成所有的注册流程。

用户只需在注册页面等待注册数据写入注册系统和 RocketMQ 的时间,即等待 55ms 即可登录。

3.2 削峰填谷

流量削峰也是 RocketMQ 的常用场景,一般在秒杀或团队抢购活动中使用广泛。

在秒杀或团队抢购活动中,由于用户请求量较大,导致流量暴增,秒杀的应用在处理如此大量的访问流量后,下游的通知系统无法承载海量的调用量,甚至会导致系统崩溃等问题而发生漏通知的情况。为解决这些问题,可在应用和下游通知系统之间加入 RocketMQ。

秒杀处理流程如下所述:

  1. 用户发起海量秒杀请求到秒杀业务处理系统。
  2. 秒杀处理系统按照秒杀处理逻辑将满足秒杀条件的请求发送 RocketMQ。
  3. 下游的通知系统订阅 RocketMQ 的秒杀相关消息,再将秒杀成功的消息发送到相应用户。
  4. 用户收到秒杀成功的通知。

3.3 分布式定时/延时调度

RocketMQ 提供精确度到秒级的分布式定时消息能力(5.0架构后),可广泛应用于订单超时中心处理、分布式延时调度系统等场景。

使用 RocketMQ 定时消息有如下优势:

  • 定时精度高、开发门槛低:消息定时时间不存在阶梯间隔,可以轻松实现任意精度事件触发,无需业务去重。
  • 高性能、可扩展:传统的定时实现方案较为复杂,需要进行数据库扫描,容易遇到性能瓶颈的问题,RocketMQ 可以基于定时消息特性完成事件驱动,实现百万级消息 TPS 能力。

RocketMQ 使用安装

RocketMQ 安装涉及 Broker、NameServer、Console,比较占用内存和难以安装,为此,建议大家统一使用星球云中间件版本学习。

云中间件版本 RocketMQ 使用方式参考:https://t.zsxq.com/CgLP7,把 VM 参数配置到应用中即可。

解锁付费内容,👉 戳