美文网首页一些收藏
电商高并发秒杀6 防刷限流

电商高并发秒杀6 防刷限流

作者: 香沙小熊 | 来源:发表于2020-03-25 14:29 被阅读0次

概述

本章介绍了常见的黄牛入侵手段,以及如何使用对应的防刷手段防止黄牛入侵。同时业务的发展预估永远可能高于系统可承载的能力,因此介绍了使用多种限流技术保证系统的稳定。

1. 验证码错峰

  • 包装秒杀令牌设置,需要验证码来错峰,分散用户的请求;
  • 数学公式验证码生成器;
1.1 代码实现
    @RequestMapping(value = "/generateverifycode", method = {RequestMethod.GET, RequestMethod.POST})
    @ResponseBody
    public void generateverifycode(HttpServletResponse response) throws BusinessException, IOException {
        String token = httpServletRequest.getParameterMap().get("token")[0];
        if (StringUtils.isEmpty(token)) {
            throw new BusinessException(EmBusinessError.USER_NOT_LOGIN, "用户还未登陆,不能生成验证码");
        }
        UserModel userModel = (UserModel) redisTemplate.opsForValue().get(token);
        if (userModel == null) {
            throw new BusinessException(EmBusinessError.USER_NOT_LOGIN, "用户还未登陆,不能生成验证码");
        }

        Map<String, Object> map = CodeUtil.generateCodeAndPic();

        redisTemplate.opsForValue().set("verify_code_" + userModel.getId(), map.get("code"));
        System.out.println("验证码为" + map.get("code"));
        redisTemplate.expire("verify_code_" + userModel.getId(), 10, TimeUnit.MINUTES);

        ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", response.getOutputStream());


    }
Map<String, Object> map = CodeUtil.generateCodeAndPic();
1.生成验证码字符串与之对应的图片
2.将字符串返回给

2. 限流

流量远比你想象的要多;
系统能运行或者总比挂了要好;
宁愿让少数人能用,也不要让所有人不能用;

限流方案
2.1 限并发

例如同一时间固定访问接口的线程数,利用全局计数器,当ServerController被唤醒某一个需要限制的接口,那我们就将下单接口Controller的入口处加一个全局计数器,并且要支持并发下的减和加的操作,当controller在入口的时候,将计数器减1,判断一下计数器的数字是否大于0,在controller出口的时候将计数器加1,就可以做到同一时间内对计数器的操作是固定的,一旦减到0或者变为负数,就要处理对应的问题;

2.2 令牌桶算法

假设有一个桶内放了许多令牌,假设用户要请求对应的实体,需要先获取一个令牌;初始状态下令牌桶内有10个令牌,客户端获取一个令牌,令牌数减一;设置一个定时器,每秒会往令牌桶内放置10个令牌,这样就可以做到客户端一秒可以访问10个对应的流量进去,下一秒就是下一个10个;可以限定某一时刻的最大值,应对突发流量;

2.3 漏桶算法原理

有一个桶,初始是满的,有10滴水,每秒流出一滴水;客户端请求的时候是往客户端里面加一滴水;

如果桶是满的这一滴水就加不进去;漏桶算法没有办法应对突发流量,其目的是用来平滑网络流量,固定的速度对应的操作。

接口维度
总维度
假设系统有10个接口,分别是商品详情,下单列表、用户登录注册等,假设每个接口都可以承载5tps的流量,对应10个接口就是50tps,那我们的系统真的能承载50tps嘛,一般要比接口维度的总和要小20%左右;

限流范围

集群限流:依赖Redis或其它中间件技术做统一计数器,往往会产生性能瓶颈;
单机限流:负载均衡的前提下单机平均限流效果更好;
限流代码实现

    private RateLimiter orderCreateRateLimiter;

    @PostConstruct
    public void init() {
        executorService = new ThreadPoolExecutor(20, 20,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1024), new ThreadPoolExecutor.AbortPolicy());
        orderCreateRateLimiter = RateLimiter.create(1000);
    }

//封装下单请求
    @RequestMapping(value = "/createorder", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommonReturnType createOrder(@RequestParam(name = "itemId") Integer itemId,
                                        @RequestParam(name = "amount") Integer amount,
                                        @RequestParam(name = "promoId", required = false) Integer promoId,
                                        @RequestParam(name = "promoToken", required = false) String promoToken) throws BusinessException {

    if (orderCreateRateLimiter.acquire() < 0) {
            throw new BusinessException(EmBusinessError.RATELIMIT);
        }
    }

相关文章

  • 电商高并发秒杀6 防刷限流

    概述 本章介绍了常见的黄牛入侵手段,以及如何使用对应的防刷手段防止黄牛入侵。同时业务的发展预估永远可能高于系统可承...

  • Java高并发解决方案

    主要讲了高并发场景:Java 高并发解决方案(电商的秒杀和抢购)主讲了电商秒杀业务,但是给的源码不全,有些关键逻辑...

  • 博文收藏

    千万级规模高性能、高并发的网络架构经验分享 Web系统大规模并发——电商秒杀与抢购 spring boot系列讲座...

  • 秒杀系统实现总结

    秒杀系统面临的技术挑战: 访问量大,对网络带宽要求高 系统如何支持瞬间的高并发 如何防止商品超卖 如何防刷、防黄牛...

  • 数据库读写分离

    我们知道电商网站经常有秒杀活动,因此不可避免的就是处理高并发的问题。说到高并发,大家都知道对数据库造成的压力很大,...

  • 高并发架构设计原则

    高并发(拆分、服务化、消息队列、缓存) 高可用(集群、限流、降级) 业务设计(幂等、防重、状态机) 限流的目的 限...

  • 超详细的Guava RateLimiter限流原理解析

     限流是保护高并发系统的三把利器之一,另外两个是缓存和降级。限流在很多场景中用来限制并发和请求量,比如说秒杀抢购,...

  • 并发三剑客之限流方案总结

    前言 对于高并发的系统,有三把利器用来保护系统:缓存、降级 和 限流。限流常见的应用场景是秒杀、下单和评论等 突发...

  • 秒杀设计

    徐汉彬:Web系统大规模并发——电商秒杀与抢购 电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的...

  • 2018-07-12《并发三剑客之限流方案总结》掘金@陌上轩客

    对于高并发的系统,有三把利器用来保护系统:缓存、降级 和 限流。限流常见的应用场景是秒杀、下单和评论等 突发性 并...

网友评论

    本文标题:电商高并发秒杀6 防刷限流

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