<返回更多

秒杀架构设计的七个必杀技

2023-04-09  微信公众号  码哥字节
加入收藏

今天我从 7 个不同的维度,讲讲秒杀系统的架构设计,主要知识点如下:

 

1. 秒杀业务的特点

 

图片

 

2. 总体思路

2.1 削峰限流

安全保护

页面优化,动静分离

异步处理

热点分离

尽量的避免秒杀功能给正常功能带来的影响,比如秒杀把服务器某个功能拖垮了。

分离可以提升系统的容灾性,但是完全的隔离的改造成本太高了,尽量借助中间件的配置,来实现冷热分离。

2.2 Nginx的设计细节

 
server {
        listen       8088;
    location ~ .(gif|jpg|jpeg|png|bmp|swf)$ {  
        root    C:/Users/502764158/Desktop/test;  
    } 

    location ~ .(jsp|do)$ {
            proxy_pass http://localhost:8082;
        }
    }
 }
 
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;

配置集群负载和容灾,设置失效重连的时间,失效后,定期不会再重试挂掉的节点,参数:

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做过载的保护

2.3 页面优化细节

降低交互的压力

安全控制

2.4 Redis集群的应用

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

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

异步处理订单

2.5 消息队列限流

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

2.6 数据库设计

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

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

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

2.7 答题验证码的设计

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

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

3. 注意事项

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

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>