三年大型电商网站心得(减库存篇)

本文探讨电商项目中减库存模块的并发问题,介绍通过验证码、数据一致性策略、行锁、表锁及Redis缓存等技术手段,有效解决秒杀活动中的库存超卖与数据不一致现象,保障高并发下系统稳定运行。

       回想自己本科毕业三年了,三年来,一直做的是电商项目,可是前两年都太忙了,一直进行简单的CRUD,反反复复,现在把项目中用到的一些设计思想和技术记录下来,今天要说的是---电商项目中减库存模块中的并发问题

       减库存并发问题一般都是在秒杀活动,爆款商品中出现,那么如何解决呢?

       机器访问问题解决:一些商贩会利用一些工具来进行下单套利交易,所以为了防止工具也就是机器请求,我们可以采用图像验证码,缺点是会导致用户体验下降.

       数据一致性问题:大型电商网站都是采用分库技术来提高数据库的并发能力,并且通过分布式缓存技术来减少数据库的压力,但是也会造成跨数据库或分布式缓存与数据库之间难以进行事务操作,由于下单和减库存不在一个事务中,可能会出现超卖或者少卖的现象,为了避免数据不一致的情况发生,并且保证前端页面能够在高并发情况下正常浏览,我们采取的是实际库存和浏览库存分离的方式,由于验证码的添加,真正到达后端下单模块的流量不如前端的大,所以可以将真实的库存保存在数据库中,而前端浏览的库存保存在缓存中,这样的话,下单和减库存就在同一个事务中进行,数据库库存更新完毕后,再将数据更新到缓存中

      行锁和表锁:众所周知,由于oracle扩展成本高,所以互联网企业一般选择mysql数据库,mysql存储殷勤myiasm采用的表锁,如果一个用户对表操作时候,就会锁定整张表,innodb采用的行锁,只有对同一行写入操作时,锁机制才会生效,所以采用innodb存储引擎,适合高并发写入的场景,那么如果采用innodb的话,一个线程获得行锁后,其他线程就将等待,随着并发数的增加,会导致数据库拒绝服务,这时我们可以将一行库存分成多行,,下单库存操作将路由到哪一条记录,可以采用多种策略,如根据用户id取模,总的库存通过sum函数进行汇总,在同步到缓存,查询库存:select sum(库存) form 库存表  ,减库存:update 商品表 set 库存 = 库存-1 where id = 1000x and sum(库存)>0 ; 但是这样存在一个问题:当总库存大于0时,但是前段下单要求刚好被路由到库存为0的记录,导致减库存失败

     redis缓存:Redis是一个key-value存储系统,是单线程的,不存在数据安全问题,数据都是缓存在内存中,在客户未下单之前,所有的商品保存到redis中,redis的吞吐量可以达到10万/m/次,所以可以很好的解决高并发问题,当下单成功之后,减少库存,然后把数据同步保存到数据库中,这样可以减少与数据库的交互

    电商网站减库存模块设计到的思想就有这些,如有不足,请补充

 

课程背景:如果赶上一个语言火的时候,您想不赚钱都难,android ,苹果,大数据,python我们没有赶上第一批,现在go语言您还想错过吗?现在go语言已经在大公司开始使用,在做服务这块慢慢已经走上热点,现在go语言视频很少而且很基础,我们早已经带着学员开始做实战了。go语言大神班为有一定基础且想深入学习go的学员量身打造,拒绝平庸,与众不同!专技术:对整个大数据生态圈的相关技术都有一定的研究,深入理解Go的原理,熟练使用GO技术解决各种业务需求。通过我们课程中的企业级项目和通俗易懂的知道点分析让你更加深了的掌握Go技术!懂架构:对业务有一定的了解,并且可以根据不同的业务场景设计出最优的技术架构。通过我们课程中的企业真实项目,全方位掌握项目的整个开发周期,达到触类旁通的目的!擅调优:一般其他语言开发项目一般都有一定的性能瓶颈,使用GO需要深入掌握项目技术架构特点和技术原理方可对项目中的瓶颈进行调优。通过项目中的调优经验让你掌握该技能!善沟通:GO在项目中扮演一个非常重要的角色,一般是在企业里做服务这块,需要跟各个部门进行协调沟通,所以要具备良好的沟通能力,业务对接能力! 课程研发环境及内容简介:1.课程研发环境项目源代码以Go1.9.2为基准,数据库以mysql为基准,以下环境都适用于项目。开发工具:VScode;数据库工具:mysql  2.内容简介什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于网站中一些稀缺或者特价的产品,电商网站一般会在约定的时间对其进行限量销售,因为这些产品的特殊性,会吸引大量用户前来抢购,并且会在约定时间同时在秒杀页面进行抢购。设计思路将请求拦截在系统上游,降低下流压力;秒杀系统特点就是并发量极大,但实际秒杀成功的请求数量确很少,所以如果不在前端拦截可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时,甚至导致系统崩溃充分利用缓存:利用缓存可以极大提高系统读写速度消息队列:消息队列可以削峰,将拦截大量并发的请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动的拉取请求消息进行业务处理前端方案浏览器端(js):页面静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量少动态元素,通过CDN来抗峰值禁止重复提交:用户提交之后按钮置灰,禁止重复提交用户限流:在某一时间内只允许用户提交一次请求,比如可以采取IP限流后端方案服务器控制器层(网关层)限制UID(userID)访问频率:我们上面拦截了浏览器的访问请求,但准对某些恶意请求和攻击或者其他插件,在服务器控制层要准对同一个uid,限制访问频率 服务层上面只拦截了一部分请求,当秒杀的用户量非常大时,即使每个用户只有一个请求,到服务层的请求数量还是很大。比如我们有100w用户同时抢购100台手机,服务层并发请求压力至少为100w。1.采用消息队列缓存请求:既然服务器层知道库存只有100台手机,那完全没有必要把100w个请求都传递到数据库里,那么可以先把这些请求都写到消息队列里面缓存一下,数据库层订阅消息库存库存成功的请求返回秒杀成功,失败的返回秒杀结束2.利用缓存应对读请求:对类似12306等购票业务,是典型的读多写少业务,大部分请求时查询请求,所以可以利用缓存分担数据库压力3.利用缓存对写请求:缓存也是可以应对写请求,比如我们可以把数据库中库存数据迁移到Redis缓存中,所有库存操作都在Redis中进行,然后通过后台进程把Redis中的用户秒杀请求同步到数据库中数据库层数据库层是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截,数据库层只承担“能力范围内”的访问请求。所以,上面通过在服务层引入的队列和缓存,让底层的数据库高枕无忧
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值