漏桶算法工具类
Posted zyf-yxm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漏桶算法工具类相关的知识,希望对你有一定的参考价值。
使用漏桶算法,规定桶子大小,流速大小,让请求以匀速进入系统业务处理层;
工具类:
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; } } }
以上是关于漏桶算法工具类的主要内容,如果未能解决你的问题,请参考以下文章