zoukankan      html  css  js  c++  java
  • 高并发下如何设计秒杀系统?

    设计一个秒杀系统,需要考虑这些问题:

    如何解决这些问题呢?

    • 页面静态化
    • 按钮至灰控制
    • 服务单一职责
    • 秒杀链接加盐
    • 限流
    • 分布式锁
    • MQ异步处理
    • 限流&降级&熔断

    页面静态化

    秒杀活动的页面,大多数内容都是固定不变的,如商品名称,商品图片等等,可以对活动页面做静态化处理,减少访问服务端的请求。秒杀用户会分布在全国各地,有的在上海,有的在深圳,地域相差很远,网速也各不相同。为了让用户最快访问到活动页面,可以使用CDN(Content Delivery Network,内容分发网络)。CDN可以让用户就近获取所需内容。

    按钮至灰控制

    秒杀活动开始前,按钮一般需要置灰的。只有时间到了,才能变得可以点击。这是防止,秒杀用户在时间快到的前几秒,疯狂请求服务器,然后秒杀时间点还没到,服务器就自己挂了。

    服务单一职责

    我们都知道微服务设计思想,也就是把各个功能模块拆分,功能那个类似的放一起,再用分布式的部署方式。

    ★如用户登录相关的,就设计个用户服务,订单相关的就搞个订单服务,再到礼物相关的就搞个礼物服务等等。那么,秒杀相关的业务逻辑也可以放到一起,搞个秒杀服务,单独给它搞个秒杀数据库。”服务单一职责有个好处:如果秒杀没抗住高并发的压力,秒杀库崩了,服务挂了,也不会影响到系统的其他服务。

    秒杀链接加盐

    链接如果明文暴露的话,会有人获取到请求Url,提前秒杀了。因此,需要给秒杀链接加盐。可以把URL动态化,如通过MD5加密算法加密随机的字符串去做url。

    限流

    一般有两种方式限流:nginx限流和redis限流。

    • 为了防止某个用户请求过于频繁,我们可以对同一用户限流
    • 为了防止黄牛模拟几个用户请求,我们可以对某个IP进行限流
    • 为了防止有人使用代理,每次请求都更换IP请求,我们可以对接口进行限流
    • 为了防止瞬时过大的流量压垮系统,还可以使用阿里的Sentinel、Hystrix组件进行限流。

    分布式锁

    可以使用redis分布式锁解决超卖问题。使用Redis的SET EX PX NX + 校验唯一随机值,再删除释放锁。

    if(jedis.set(key_resource_id, uni_request_id, "NX", "EX", 100s) == 1){ //加锁
        try {
            do something  //业务处理
        }catch(){
      }
      finally {
           //判断是不是当前线程加的锁,是才释放
           if (uni_request_id.equals(jedis.get(key_resource_id))) {
            jedis.del(lockKey); //释放锁
            }
        }
    }

    在这里,判断是不是当前线程加的锁和释放锁不是一个原子操作。如果调用jedis.del()释放锁的时候,可能这把锁已经不属于当前客户端,会解除他人加的锁。为了更严谨,一般也是用lua脚本代替。lua脚本如下:

    if redis.call('get',KEYS[1]) == ARGV[1] then 
       return redis.call('del',KEYS[1]) 
    else
       return 0
    end;

    MQ异步处理

    如果瞬间流量特别大,可以使用消息队列削峰,异步处理。用户请求过来的时候,先放到消息队列,再拿出来消费。

    限流&降级&熔断

    • 限流,就是限制请求,防止过大的请求压垮服务器;
    • 降级,就是秒杀服务有问题了,就降级处理,不要影响别的服务;
    • 熔断,服务有问题就熔断,一般熔断降级是一起出现。
  • 相关阅读:
    常见数据结构考题
    [转]Win7 系统安装VS2008没反应 点击安装一闪就没有反应 .
    [转]40个实习生最基本的规矩
    [转]C++中重载(overload)、覆盖(override)、隐藏(hide)的区别
    iPhone开源项目
    eclipse快捷键
    [转]cocos2d游戏开发,常用工具集合
    discuz中常用的一些东西
    抽象类与接口的区别
    Head.First设计模式学习笔记
  • 原文地址:https://www.cnblogs.com/ooo0/p/15206831.html
Copyright © 2011-2022 走看看