基于电商场景的高并发RocketMQ实战-发送优惠券流程解析、生产环境的落库与定时推送解决方案

本文主要是介绍基于电商场景的高并发RocketMQ实战-发送优惠券流程解析、生产环境的落库与定时推送解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注),发送【资料】可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景中间件系列笔记编程高频电子书
【11来了】文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁

发送优惠券流程【落库+定时推送生产环境解决方案】

首先,还是先了解业务逻辑的背景,对于系统中不活跃的用户,需要通过给这些用户发送优惠券来激活这些用户的消费,那么在给这些用户发送优惠券的时候,可能并不想立即就发送,而是定时发送,那么这里的解决方案就是通过先将优惠券信息 落库,再通过 xxl-job 去扫描这个表执行优惠券推送给用户的任务

那么整个发送优惠券的流程如下:

这里先主要说一下如何对定时任务进行落库的,首先创建了一个优惠券,将这个优惠券进行推送,那么既然定时推送,就需要在优惠券的信息中定义 3 个数据:定时推送开始时间定时推送结束时间推送轮次,推送轮次表示在开始推送到推送结束这之间需要推送多少次

定时任务的落库就是通过这 3 个数据计算出来每一次推送的时间点,每一次推送都作为一个定时任务落库,如果 推送轮次 = 1,那么直接将 定时推送的开始时间 作为任务执行时间即可,如果 推送轮次 > 1,那么需要通过 (定时推送结束时间 - 定时推送开始时间) / 推送轮次 来拿到每次任务的执行时间,将每次需要执行的定时任务都落库存储即可

至此,给不活跃用户发送优惠券的主流程就已经结束了,接下来就进入到 xxl-job 去扫描定时任务并执行的阶段,xxl-job 执行流程如下:

  1. 首先去数据库中扫描 执行时间 <= 当前时间 并且 没有执行过 的任务

  2. 将该定时执行任务发送到 MQ 中,等待消费者消费

    这里推送定时任务到 MQ 中,还是需要进行 分片 + 多线程进行推送 来提升推送速度(因为需要推送的用户数量太庞大),分片 + 多线程优化推送的流程和上边 创建促销活动 时是一样的,这里就不重复说了

  3. 发送到 MQ 之后,将该任务状态修改为 已执行,并修改数据库

总结来说,定时发送优惠券就是先将定时任务落库,再通过 xxl-job 去扫描定时任务进行推送即可

大量定时任务通过 xxljob 执行【优化方案】

这里讲的大量定时任务是什么呢?

首先,还是说一下业务背景,对于热门商品的推送在电商场景中是很常见的,那么每一个热门商品所需要推送给的用户可能都是不同的,因此会通过另外一个推荐系统,计算出大量的热门商品,之后再对这些热门商品进行用户的推送,而热门商品推送给用户一般也是定时进行推送的,这里使用了 xxl-job 来进行实现定时的推送,但是这里需要推送的商品数量也是很多的,单靠一个机器进行定时推送速度很慢,那么这里就通过任务分片来加快推送的速度

先获取 当前任务的分片索引,再获取 总共任务分片的数量,之后可以通过需要推送商品的 id 来进行分片处理,下边写一个简单的伪代码:

@XxlJob("job")
public void job() {// 获取 xxlJob 中当前任务的分片索引int shardIndex = Optional.of(XxlJobHelper.getShardIndex()).orElse(0);// 获取 xxlJob 中当前任务的总分片数量int totalShardNum = Optional.of(XxlJobHelper.getShardTotal()).orElse(0);// 循环任务,推送到 MQ 中for (Good good : goods) {Long goodId = good.getId();// 计算出商品 id 应该被哪一个任务分片处理int curNo = goodId.hashCode() % totalShardNum;// 如果当前任务分片索引和商品需要被处理的分片索引不同,就不处理,直接跳过if (curNo != shardIndex) {continue;}}
}

需要推送的商品和任务执行的分片对应关系如下:

在这里插入图片描述

项目中为什么要引入 RocketMQ?【面试】

在面试的时候,讲项目要讲整个业务闭环讲清楚,以及引入中间件的需要和背景

项目中引入 RocketMQ 的优点在于:

  • 削峰填谷
  • 异步优化
  • 高扩展性

首先对于 削峰填谷,在 RocketMQ 中通过减少消费者的线程数或者限制消费者的消费能力来进行削峰,在系统低负载期间,通过增加消费者的线程数量来进行填谷,可以保证系统在运行期间,负载基本上处于一个稳定的状态,不会突然因为极高的负载而出现意外情况

其次是异步优化,这是很关键的,比如在运营人员创建完促销活动之后,需要对用户进行活动的推送,那么这个推送是很消耗时间的,因此需要将推送的任务在创建促销活动中异步出去,将耗时任务从主流程中剥离出去慢慢执行,不影响主流程的执行时间

对于高扩展性,在用户创建完订单之后,如果取消订单,在不使用 MQ 的情况下,需要在取消订单的逻辑中去一个一个执行取消订单后需要执行的操作,如下:

  • 库存系统释放库存
  • 返还用户积分
  • 释放用户使用的优惠券

这样会导致取消订单的动作和其他业务耦合度很高,如果使用 MQ 之后,只需要在这三个地方关注订单取消的事件,不需要将取消订单中做很多耦合的操作

如果后续需要对取消订单做出调整,只用在订阅【取消订单】事件的位置修改代码即可

这篇关于基于电商场景的高并发RocketMQ实战-发送优惠券流程解析、生产环境的落库与定时推送解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565415

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien