这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
准备工作
MySQL
- 安装MySQL,推荐使用MySQL8及以上版本
- 熟悉ddl,dml等基础语法
- 了解sql优化
Redis
- 安装Redis,推荐最新版本
- 了解Redis的基本数据类型和使用场景
- 熟悉常用命令
- 了解Lua脚本的使用
- 了解Redis分布式锁
RocketMQ
- 安装RocketMQ,推荐最新版本
- 了解RocketMQ的基础概念和架构
- 了解MQ的使用场景
- 了解生产者如何保证消息的可靠性发送
- 了解消费者如何保证幂等
- 了解消费者pull和push模式的区别
OpenResty
- 安装OpenResty,推荐最新版本
- 了解Nginx的基础概念和使用
- 了解Lua脚本的语法
Linux
- 熟悉常用命令
- 熟悉进程和线程
- 了解Linux调优
Java
- 按照JDK,推荐JDK11
- 熟悉Java基础语法和lambda表达式
- 熟悉idea的使用
- 了解并发编程
- 了解springboot框架的使用
- 了解maven的使用
Jmeter
- 安装Jmeter
- 了解使用Jmeter压测
作者:青训营官方账号
链接:juejin.cn/post/719438…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
项目概述
设计一个电商秒杀业务
系统设计流程
4S 分析法:
- 场景分析(什么系统,需要什么功能,并发量多少)
- 存储设计
- 服务设计(业务功能和逻辑)
- 可扩展性
发现系统瓶颈
- 火焰图
- 链路追踪
- 性能测试
电商秒杀业务介绍
消费侧 供应侧 交易环境
SPU SKU
业务特点
- 瞬时流量高
- 读多写少
- 实时性高
挑战
- 反欺诈
- 防止超卖
- 流量管控
- 高性能
- 扩展性
- 鲁棒性
- 资源成本
如何设计秒杀系统
上面说到的 4S 分析法
存储方面 :
Localcache-->redis-->mysql
服务方面 :
ID 生成器:分布式 id MQ 组件:为了削峰 ...
扩展方面:
- 流量隔离
- CDN
- 缓存优化
- 流量管控
代码
关键部分
db 锁性能差,是行锁 如果先 get 再 decrease,不是原子性的,也可能有问题。 故而使用 redis 脚本保证原子性
锁方面,加锁通过代码,解锁通过 redis 脚本(防止误删),lock 有一个唯一的 uuid
nginx 动静分离 ip rate limit 为了防刷单等黑产
jmeter 压测工具
思考
- 当用户请求放到 MQ 中,其实已经返回了 true, 如果这个时候用户去取消订单/查看订单(但 MQ 还没处理这个订单时),该怎么处理这个情况。
总结
- 服务无状态(当前服务不存储状态,不存储数据)
- 批量写入(降低系统压力很好的手段)
- 最终一致性(redis ,MQ 等可能导致数据不一致)