其他分享
首页 > 其他分享> > 一个问烂了的问题--怎么设计秒杀(各种blog集合)

一个问烂了的问题--怎么设计秒杀(各种blog集合)

作者:互联网

秒杀的概念

中秋节搞活动,商家上架了一款mbp,价格比平时便宜1000块,数量20台,设定在凌晨12点开始售卖

中秋节放假,某公司有100个员工,下班以后这100个用户玩手机的时候发现了这款mbp,皆欲购置于麾下,大家晚上熬夜到12点开始一起抢这20台

示例场景,单机多线程

100个并发访问数量不大,单机服务就能解决

 

实际场景,多机多线程

业务隔离

后端单独编写业务接口,卖家要参加秒杀这种营销活动需要单独报名,与其他业务隔离

前端将不涉及秒杀的静态数据缓存在页面,发送请求只更新涉及到的按钮和页面

系统隔离(runtime的隔离)

数据隔离

秒杀所调用的数据大部分都是热数据,单独启用Redis集群或MySQL数据库来放热点数据

流量削峰

拉长下单窗口时间,秒杀请求前置图形验证码,答题验证等

链路热点维护

上游服务的热点数据提前下透到下游服务,提前异步订阅热点日志,维护热点数据

Java层

高并发读单点瓶颈 LocalCache

脏数据读取问题,在写时保证最终一致性

本地缓存定时更新可能会出现脏数据,在更新数据库的时候去判断,保证最终一致性能

热点商品高并发读写影响数据库的其他商品

热点商品放到单独的热点库,单独部署

并发锁

每个节点的应用层做单机限流排队

多结点分布式锁,Redis/Zookeeper

超卖和卖不出去

超卖是因为高并发情况下库存的缓存数据没有及时更新,写时没有进行可用库存判断

缓存层

数据层

UPDATE item SET inventory = if(inventory < 1, 0, inventory - 1);

卖不出去是因为都哥用户下单之后一直未支付导致,一般是恶意的网络攻击

需要检测重复下单不支付的用户并取消其秒杀资格

高可用系统构建

架构阶段、编码阶段、测试阶段、发布阶段、运行阶段,结合devops

标签:缓存,单独,--,数据,问烂,blog,并发,秒杀,热点
来源: https://www.cnblogs.com/SourLemon/p/15782897.html