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异步处理

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

    限流&降级&熔断

    • 限流,就是限制请求,防止过大的请求压垮服务器;
    • 降级,就是秒杀服务有问题了,就降级处理,不要影响别的服务;
    • 熔断,服务有问题就熔断,一般熔断降级是一起出现。
  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/ooo0/p/15206831.html
Copyright © 2011-2022 走看看