【项目总结】Java秒杀系统的设计与实现

2019-12-23  本文已影响0人  胖三斤66

一、系统设计

1.1 秒杀系统概述

特点
1)时间短、瞬间访问量大
2)读多写少的场景。(库存固定则写操作固定,但访问量肯定无限大)

难点
1)库存只有一份,但大量用户在集中时间对该数据进行读写。
2)秒杀系统之所以挂,是因为请求没有经过上游的过滤与拦截,直接压倒在下游的数据层。

常见的 Java Web 架构

常见的 Java Web 架构

1.2 优化思路

核心思想:尽量将请求拦截在系统上游;读多写少的场景使用缓存
介绍一些常见的操作:

1)浏览器端的拦截

2)站点层的拦截

3)服务层的拦截

4)其他

参考

[1] 如何设计秒杀系统? - 阿里云云栖号的回答 - 知乎
[2] 如何设计秒杀系统? - 敖丙的回答 - 知乎

二、系统实现

来源:慕课《Java高并发秒杀》

框架:SSM
业务:只关注秒杀这块,所以页面只有两个,分别是秒杀商品列表页和商品详情页
特点:短时间内,高并发。

2.1 业务流程

秒杀总体的业务流程

2.2 系统架构

当然这里并没有完全实现

系统部署架构图

PS:

2.3 优化分析

瓶颈分析

从业务角度分析,高并发主要发生在秒杀商品详情页。进入秒杀商品详情页以及请求涉及到的操作有:

  1. 获取网页资源,包括静态资源和动态资源
  2. 获取服务器时间的请求
  3. 获取秒杀地址的请求
  4. 执行秒杀的请求

1)加载网页资源

2)获取服务器时间的请求

3)获取秒杀地址的请求

4)执行秒杀的请求

结论:

优化方案

1)浏览器端采用的拦截
a. 不提前暴露秒杀地址,以及增加 md5 不让用户提前猜到秒杀地址。避免使用机器秒杀
b. 商品详情页静态化。

2)Web层采用的拦截
a. 页面静态化
b. 将静态文件存放到 CDN。【本项目并没有实现】

3)Service层的优化
a. Redis 缓存商品信息,并设置超时时间来维护数据一致性
b. Redis 缓存商品库存,并利用 Redis 事务和 lua 脚本完成写请求。【本项目并没有实现】

4)数据库层的优化
a. 使用 MySQL 的存储过程,减少服务器端和数据库端通信次数,从而降低网络延迟和GC时间。

2.4 URL设计

URL 解释
/list 秒杀商品列表页
/{seckillId}/detail 秒杀商品详情页
/{seckillId}/exposer 获取商品的秒杀地址,主要工作内容是生成md5。
/{seckillId}/{md5}/execution 执行秒杀
/time/now 获取服务器时间

PS:

2.5 效果展示

秒杀商品列表页 秒杀商品详情页-三种状态

扩展阅读

[1] 服务端高并发分布式架构演进之路 - 个人文章 - SegmentFault 思否

上一篇下一篇

猜你喜欢

热点阅读