秒杀操作
1.秒杀流程
一.详情页面操作
CDN(内容分发网络)加速用户获取数据的系统,部署会在最近的网络节点上,当命中CDN不会需要访问后端服务器(公司可搭建也可租用电信)
二、秒杀地址接口
1.无法静态化无法使用CDN缓存
2.适合使用服务器端缓存redis服务器等
3.一致性成本(超时穿透、主动进行更新)
三、秒杀操作优化分析
1.无法使用CDN缓存2. 后端缓存困难:库存问题
执行方案:执行秒杀并执行成功时,会发生减库存使用原子计数器(Atomic)可以使用redis服务器进行操作,同时要记录谁购买了商品使用技术分布式MQ进行发送,将消息写入MySQL数据库中
难点:数据一致性问题,购买失败回滚方案,幂等性保证防止同一个用户多次执行秒杀。Java控制事务分析。
存在问题:更新完库存后进行记录商品明细,每一次数据库都得等待mysql行级锁。
当减库存update和记录商品购买情况,将客户端逻辑放在mysql服务器端,减少网路之间延迟和GC影响。
解决方案:使用存储过程,整个事务在mysql端进行完成。
优化:1将静态页面存放在CDN节点上,页面可以控制用户多次点击
2.查询商品秒杀开始/结束时间、查询商品库存量等可使用redis服务器进行操作
3.当进行秒杀时,要减库存和添加商品的购买明细(谁购买商品),主要是商品的竞争优化:减少事务锁时间
编码操作:
1.查询操作 :
使用商品ID进行查询数据库存量,通过redis服务器进行热点商品的访问。当存在直接返回,不存在再进行访问数据库,数据库存在时将查询的数据放在redis中。
Java使用jedis客户端进行访问redis服务器,使用ID查询redis时需要将ID进行序列化操作(使用ProtostuffIOUtil进行序列化和反序列化)
2.使用存储过程完成一组sql的执行,减少网路延迟和GC。Mybatis进行调用存储过程
总结:请求被CDN缓存拦截将静态化的页面放入cdn节点上,然后使用智能DNS解析主要找到nginx地址,通过用户Ip进行智能解析到最近的服务器,然后进行负载均衡,然后进行逻辑集群redis,访问数据库对关键的ID进行分库分表(mod seckilled),对用户购买情况进行分析统计。
网友评论