美文网首页
秒杀系统设计

秒杀系统设计

作者: 过去今天和未来 | 来源:发表于2017-11-25 18:50 被阅读119次

    秒杀操作

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

    相关文章

      网友评论

          本文标题:秒杀系统设计

          本文链接:https://www.haomeiwen.com/subject/rdgcbxtx.html