秒杀系统设计

秒杀操作

  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),对用户购买情况进行分析统计。

你可能感兴趣的:(秒杀系统设计)