转载

秒杀系统设计

点击蓝色“ 乔志勇笔记 ”关注我哟

加个“ 星标 ”,第一时间获取推送的文章哦!

一、设计要点

一致性 、高可用、高并发情况下的高性能

二、设计原则

1、数据要尽量少

2、请求数尽量少

3、路径要尽量短

4、依赖要尽量少

5、不要有单点

三、业务上的实践

1、定时上架 "购买按钮"

2、增加答题秒杀

3、减少不必要的装饰功能

4、刷新抢宝 时 刷新指定部分页面

5、采用发送优惠券,抽奖活动,分散流量

四、技术上的实践

(1) 动静分离

1)数据分离:

动态数据:个性化的数据,时间或地域数据

2) 考虑要点 :

1、静态数据的储存

实体机单机部署

统一的cache 层

上cdn

2、动静结合方式

服务端ESI 方案 :freemarker 适用于普通的商品推荐

客户端CSI 方案 : 异步ajax 适用于秒杀推荐

(2)热点数据

1、发现热点数据

静态、动态发现

2、处理热点数据

实时缓存,业务隔离,请求加队列限制

(3) 流量消峰

1、排队

2、答题

3、分层过滤

(4) 一致性的减库存

1)下单减库存 逻辑简单 ,性能更好

2)没有复杂的 SKU 库存和总库存这种联动关系 ,可以用redis 减库存

3)针对InnoDB锁竞争,可以优化

1、应用层做排队

2、数据库层做排队

(5)高可用的兜底方案(层级递增)

1、降级

2、限流

基于排队策略:

客户端 线程数限流,设置请求超时时间

服务端基于QPS做限流保护

3、拒绝服务

防止系统宕机:

在最前端的 Nginx 上设置过载保护,当机器负载达到某个值时直接拒绝 HTTP 请求并返回 503 错误码,在 Java 层同样也可以设计过载保护

参考:许令波的设计秒杀系统

参考实践代码:https://gitee.com/QiaoZhiYong/spring-boot-seckill

https://github.com/qiaozhiyong/miaosha

近期文章:

5种分布式锁实现的对比?

Java并发编程学习体系

java8 Stream 史上最全总结

Java 网络编程"初探"

redis 知识点总结

java 核心技术学习总结 (一)

spring中"投机取巧"地限制 用户同时登陆

如果你喜欢本文

请长按二维码,关注 乔志勇笔记

秒杀系统设计

原文  http://mp.weixin.qq.com/s?__biz=MzU5Mzg4NjIzMA==&mid=2247483751&idx=1&sn=95a205fde36c90c9463da6e35c78dc25
正文到此结束
Loading...