这是我参与「第五届青训营 」伴学笔记创作活动的第 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都会有新的数据副本,但是都会达到最终一致性。