7.秒杀系统的设计分析 | 青训营笔记

85 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

1.系统设计方法

场景设计,哪些功能,多大的并发量

存储设计,数据怎么组织,sql存储,nosql存储

服务设计,业务功能实现和逻辑整合

可扩展性,设计缺陷,提高鲁棒性扩展性

2.电商的业务

秒杀特点:瞬时流量高,读多写少,实时性要求高

挑战:资源成本,有限资源做体量较大的业务;反欺诈,黄牛非法牟利;高性能,实时系统要求比较高,不能超卖;流量管控,无用流量拦截过滤;扩展性;鲁棒性;

秒杀系统的设计:

场景:

功能:秒杀活动的发布,秒杀商品的详情(高并发量读),秒杀下单接口

并发:万人参与秒杀,QPS1w+,TPS1k+

存储

mysql redis localcache

表设计:

3.课程实践

接下来的环节是看代码。

防止超卖,加一下大于的那个条件

生成redis键值对

减少库存的时候,不直接从数据库扣,而是扣缓存里的库存。因为mysql有行锁,效率比较低,

redis扣库存, get decrease 保证不了原子性

只用decrease,原子的但是不可以,从100 -900 + 10 因为回补的10个因为是负数也是没法用的。

解决办法,用redis的原子性操作

分布式锁,同一时间只有一个请求能去请求数据库,否则就自旋,一直到redis补充完数据。

redis不是单线程的,

使用jmeter做压力测试,

问题,订单进入消息队列,还没有入库,但是用户突然取消了订单,这时候怎么处理?

总结

服务无状态,云原生横向扩展,

批量写入,降低系统压力的很好的办法,

最终一致性,redis做缓存,mq都会有新的数据副本,但是都会达到最终一致性。