企业级分布式优惠券系统设计--1(持续更新中)

这篇只是简单介绍优惠券系统的大概功能和模块架构,后续会更新功能点的详细设计和技术难点分析。大家有任何技术疑问也可以联系我或在评论区讨论。

简介

主要实现优惠券促销活动,首先创建活动,然后创建券组,采用预处理的方式提前进行制券,然后分发优惠券。

技术栈

SpingBoot

SpringCloud

MySQL

Redis

RocketMQ

系统架构图

模块划分

模版模块:提供给运营人员,运营人员根据要求构建优惠券模版

分发模块:面向用户,提供查看、领取、结算、核销优惠券等功能。需要依赖模版微服务与结算微服务

结算模块:结算优惠券,对优惠券规则进行计算

模版微服务

运营人员通过设定条件创建优惠券模版,之后生成对应数量优惠券,最后用户才可以去领取优惠券

核心功能:运营人员设定好条件(名称、logo、数量等)创建优惠券模版,后台异步创建对应数量优惠券。创建优惠券过程比较耗时,http接口不返回不是一种很好的体验,所以使用异步操作

使用Redis保存优惠券码,提高效率

查询优惠券信息功能,用于提供给其他微服务调用

分发微服务

面向用户,提供查看优惠券、领取优惠券、核销优惠券与结算优惠券功能

查看优惠券

​ 根据不同信息查询对应优惠券模版信息,需要依赖模版微服务

领取优惠券

​ 通过验证,即优惠券模版是可领取的,且成功获取到优惠券码,就将优惠券写入MySQL与Redis

核销优惠券

​ 标记优惠券状态为已使用,更新MySQL与Redis数据

结算微服务

​ 调用结算微服务计算优惠券规则

结算微服务

根据优惠券类型计算优惠券

技术亮点

  1. 使用Redis做缓存提高访问速度与并发量,减少数据库压力
  2. 使用异步线程生成优惠券码
  3. 仿照Redis过期册,使用定期删除+惰性删除方法,检测删除过期的优惠券模版
  4. 使用RabbitMQ异步处理已使用与已过期优惠券信息回写到数据库
  5. 优惠券业务逻辑优化
全部评论

相关推荐

03-12 20:51
门头沟学院 Java
吐槽一下:企业微信是真忙啊,面试过程中,面试官还会被拉去开会,开局写完三道算法之后,硬是让我等了将近一个小时,体验非常不好....---#### **一、算法题**1. **二维数组处理**     - 题目描述:对二维数组按第一列升序、第二列降序排序后,求第二列的最长递增子序列     - 思路:排序后转化为最长递增子序列(LIS)问题,用动态规划或贪心+二分解决  2. **滑动窗口问题**     - 题目描述:维护一个窗口,保证窗口内字符不重复,求最大窗口长度     - 思路:滑动窗口+哈希表记录字符位置  3. **二叉树第K大元素**     - 题目描述:按左-根-右顺序收集元素后取第K大值     - 思路:中序遍历得到有序列表后直接取第K大(暴力解法)  ---#### **二、项目相关**1. **登录鉴权机制**     - 流程:手机号+验证码登录,未注册用户自动注册     - Token刷新:通过拦截器对非登录请求刷新Token有效期     - **追问**:       - Token生成算法?使用JWT(Header+Payload+Signature)       - Token唯一性保障?通过JWT签名和用户唯一标识  2. **数据库优化**     - 慢查询解决:检查索引失效、分库分表、SQL优化     - **索引原则**:       - 高区分度字段优先       - 联合索引遵循最左匹配原则       - 避免对长文本字段建索引  ---#### **三、缓存问题**1. **缓存穿透**     - 场景:请求不存在的数据(如非法ID)     - 解决:缓存空值+布隆过滤器  2. **缓存击穿**     - 场景:热点Key失效后高并发请求压垮数据库     - 解决:互斥锁(如Redis的SETNX)  3. **缓存雪崩**     - 场景:大量Key同时过期     - 解决:随机过期时间+集群部署  ---#### **四、多线程与锁**1. **线程安全集合**     - `ConcurrentHashMap` vs `Hashtable`:分段锁 vs 全表锁  2. **锁机制**     - 悲观锁:`synchronized`、`ReentrantLock`     - 乐观锁:CAS(如Atomic类)、版本号     - **区别**:悲观锁强一致但性能低,乐观锁高并发但需处理冲突  ---#### **五、消息队列**1. **选择RabbitMQ的原因**     - 轻量级、适合单体项目,对比Kafka/RocketMQ更简单  2. **长连接实现**     - 基于AMQP协议,通过心跳机制维持TCP长连接  ---#### **六、设计模式与AOP**1. **AOP应用场景**     - 公共字段自动填充(如创建时间、更新人)     - 实现:通过切面拦截DAO层操作  ---#### **七、反问环节**1. 实习生工作内容:测试平台开发,参与1-2个项目  2. 面试轮次:4轮技术面(按正式员工标准)  3. 改进建议:技术深度需加强(如Redis底层原理、锁实现细节)  ---**参考答案亮点**  - **JWT结构**:Header(算法)、Payload(用户信息)、Signature(签名)  - **索引失效场景**:对字段使用函数、类型隐式转换、模糊查询左匹配  - **CAS问题**:ABA问题(通过版本号解决)、自旋开销  - **RabbitMQ协议**:基于AMQP,支持多种消息模式(Work Queue、Pub/Sub)
查看16道真题和解析
点赞 评论 收藏
分享
评论
7
16
分享

创作者周榜

更多
牛客网
牛客企业服务