• 使用Guava的RateLimiter完成简单的大流量限流


    使用场景

    系统使用下游资源时,需要考虑下游对资源受限、处理能力,在下游资源无法或者短时间内无法提升处理性能的情况下,可以使用限流器或者类似保护机制,避免下游服务崩溃造成整体服务的不可用。

    常用算法

    常见限流算法有两种:漏桶算法和令牌桶算法

    限流的一般思路:

    1、随机丢弃一定规则的用户(迅速过滤掉90%的用户);

    2、MQ削峰(比如设一个MQ可以容纳的最大消息量,达到这个量后MQ给予reject);

    3、业务逻辑层使用RateLimiter(令牌桶算法)进行限流;

    4、最终可以承受的流量到达DB层。

    package ratelimiter;
    
    import com.google.common.util.concurrent.RateLimiter;
    import org.springframework.stereotype.Component;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author xfyou
     * @date 2018/10/31
     */
    @Component
    public class AccessLimitService {
    
        private static volatile int acquireCount = 0;
        private static final Object OBJECT = new Object();
    
        /**
         * 每秒可以获得50个许可证
         */
        private RateLimiter rateLimiter = RateLimiter.create(50);
    
        private boolean tryAcquire() {
            // 等待1秒钟如果未能获取到许可证就返回false,否则返回true
            return rateLimiter.tryAcquire(1, 1000, TimeUnit.MILLISECONDS);
        }
    
        public static void main(String[] args) {
            AccessLimitService accessLimitService = new AccessLimitService();
            ExecutorService executorService = Executors.newCachedThreadPool();
            for (int i = 0; i < 1000; i++) {
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        if (accessLimitService.tryAcquire()) {
                            System.out.println("获取许可证,执行业务逻辑。");
                            synchronized (OBJECT) {
                                System.out.println(++acquireCount);
                            }
                            try {
                                Thread.sleep(20);
                            } catch (InterruptedException ex) {
                                //
                            }
                        } else {
                            System.err.println("未获取到许可证,请求可以丢弃。");
                        }
                    }
                });
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            executorService.shutdown();
        }
    }
  • 相关阅读:
    极客时间-左耳听风-程序员攻略-异步I/O模型和Lock-Free编程
    将SSRF升级为RCE(AWS环境)
    PowerShell ISE/文件名解析缺陷远程执行代码漏洞#RCE
    利用工具破解HTTP身份验证的多种方法
    ICMP shell
    CVE-2018-19386:SolarWinds数据库性能分析器中反射的XSS
    Recon ASRC Conference
    Python扫描器-爬虫基础
    The Bug Hunters Methodology v3(ish)
    svn状态图标大全
  • 原文地址:https://www.cnblogs.com/frankyou/p/9888049.html
Copyright © 2020-2023  润新知