秒杀&支付秒杀专题Java技术升华

秒杀架构的设计细节

2019-02-03  本文已影响151人  黄靠谱

参考资料

极客时间里面买的秒杀系统的课程

这个比较靠谱的博客
http://blog.51cto.com/13527416/2085258?cid=700792

架构图

Nginx
集群的路由层 + Redis(缓存热点数据、分布式锁)
MQ集群
业务处理层
数据库层(读写分离、热点隔离)

秒杀业务的特点

image

总体思路

  1. 削峰限流:
  1. 安全保护:
  1. 页面优化,动静分离
  1. 异步处理:
  1. 热点分离:
    尽量的避免秒杀功能给正常功能带来的影响,比如秒杀把服务器某个功能拖垮了
    分离可以提升系统的容灾性,但是完全的隔离的改造成本太高了,尽量借助中间件的配置,来实现冷热分离
  1. 避免单点:各个环节都要尽力避免

  2. 降级:临时关闭一些没那么重要的功能,比如秒杀商品的转赠功能、红包的提现功能,待秒杀峰值过了,设置开关,再动态开放这些次要的功能

Nginx的设计细节

  1. 动静分离,不走tomcat获取静态资源
 server {
        listen       8088;
    location ~ \.(gif|jpg|jpeg|png|bmp|swf)$ {  
        root    C:/Users/502764158/Desktop/test;  
    } 

    location ~ \.(jsp|do)$ {
            proxy_pass http://localhost:8082;
        }
    }
 }
  1. gzip压缩,减少静态文件传输的体积,节省带宽,提高渲染速度
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 3;
    gzip_disable "MSIE [1-6]\.";
    gzip_types   text/plain application/x-javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
  1. 配置集群负载和容灾,设置失效重连的时间,失效后,定期不会再重试挂掉的节点,参数
    upstream  netitcast.com {  #服务器集群名字   
    server    127.0.0.1:8080;
    server    127.0.0.1:38083;
    server    127.0.0.1:8083;
    } 

 server {
        listen       88;
        server_name  localhost;
    location / {  
            proxy_pass http://netitcast.com;  
            proxy_connect_timeout       1;
            fail_timeout 5;
        } 
    }
  1. 集成Varnish做静态资源的缓存
  2. 集成tengine做过载的保护

页面优化细节

  1. 降低交互的压力
  1. 安全控制

Redis集群的应用

  1. 分布式锁(悲观锁)
  2. 缓存热点数据(库存):如果QPS太高的话,另一种方案是通过localcache,分布式状态一致性通过数据库来控制

分布式悲观锁(参考redis悲观锁的代码)

异步处理订单

消息队列限流

消息队列削峰限流(RocketMQ自带的Consumer自带线程池和限流措施),集群。一般都是微服务,订单中心、库存中心、积分中心、用户的商品中心

数据库设计

要执行的操作:扣减库存、生成新订单、生成待支付订单、扣减优惠券、积分变动

库存表是数据库并发的瓶颈所在,需要在事务控制上做权衡:可以把扣减库存设置成一个独立的事务,其它操作成一个大的事务(订单、优惠券、积分操作),提高并发度,但是要做好额外的check

update 库存表 set 库存=库存-1 where id=** and 库存>1

答题验证码的设计

验证码的设计可以分为2种:

  1. 验证失败重新刷新答题(12306):服务器交互量大,每错一次交互一次,但是可以大大降低秒杀器答题的可能性,因为没有试错这个功能,答题一直在变

  2. 验证失败提示失败,但是不刷新答题的算法:要么答题成功,进入下单界面,要么提示打错,继续答题(不刷新答题,无须交互,用js验证结果)。
    这种方案,可以在加载题目的时候一起加载MD5加密的答案,然后后台再校验一遍,实现类似的防止作弊的效果。好处是不需要额外的服务器交互。
    MD加密答案的算法里面要引入 userId PK这些因素进来来确保每次答案都不一样而且没有规律,避免秒杀器统计结果集

答题的验证:除了验证答案的正确性意外,还要统计反应时间,例如12306的难题,正常人类的答题速度最快是1.5s,那么,小于1s的验证可以判定为机器验证

注意事项

为了提升并发,需要在事务上做妥协:

上一篇 下一篇

猜你喜欢

热点阅读