• 漏桶算法工具类


    使用漏桶算法,规定桶子大小,流速大小,让请求以匀速进入系统业务处理层;

    工具类:

    public class BucketLimitManage {
        private Map<String, Funnel> funnelMap = new ConcurrentHashMap<>();
        
        /**
         * 根据给定的漏斗参数检查是否允许访问
         *
         * @param username   用户名
         * @param action     操作
         * @param capacity   漏斗容量
         * @param allowQuota 每单个单位时间允许的流量
         * @param perSecond  单位时间(秒)
         * @return 是否允许访问
         */
        public boolean isActionAllowed(int capacity, int allowQuota, int perSecond) {
            String key = "funnelkey";
            if (!funnelMap.containsKey(key)) {
                funnelMap.put(key, new Funnel(capacity, allowQuota, perSecond));
            }
            Funnel funnel = funnelMap.get(key);
            return funnel.watering(1);
        }
    
        private static class Funnel {
            private int capacity;
            private float leakingRate;
            private int leftQuota;
            private long leakingTs;
    
            public Funnel(int capacity, int count, int perSecond) {
                this.capacity = capacity;
                // 因为计算使用毫秒为单位的
                perSecond *= 1000;
                this.leakingRate = (float) count / perSecond;
            }
    
            /**
             * 根据上次水流动的时间,腾出已流出的空间
             */
            private void makeSpace() {
                long now = System.currentTimeMillis();
                long time = now - leakingTs;
                int leaked = (int) (time * leakingRate);
                if (leaked < 1) {
                    return;//表示超出速率
                }
                leftQuota += leaked;
                // 如果剩余大于容量,则剩余等于容量
                if (leftQuota > capacity) {
                    leftQuota = capacity;
                }
                leakingTs = now;
            }
    
            /**
             * 漏斗漏水
             *
             * @param quota 流量
             * @return 是否有足够的水可以流出(是否允许访问)
             */
            public boolean watering(int quota) {
                makeSpace();
                int left = leftQuota - quota;
                if (left >= 0) {
                    leftQuota = left;
                    return true;
                }
                return false;
            }
        }
        
    }
  • 相关阅读:
    .sln是什么的格式
    VMware的四种网络连接方式
    Cisco 2950交换机 配置手册
    Framework2.0标识没有写访问权限的解决办法
    ASP.NET IIS 注册工具
    .suo介绍
    Uri In WPF
    BindingErrorListener In WPF
    WPF 详解模板
    .NET装饰器(Decorator)模式
  • 原文地址:https://www.cnblogs.com/zyf-yxm/p/10654093.html
Copyright © 2020-2023  润新知