流量控制是老生常谈的话题,包括两方面:
大部分系统聊的都是前者,今天我们聊聊后者。
请求外部服务,或者做批量数据同步,下游依赖服务有最大并发控制,不想接口因为限流而失败,同时又想尽可能的提高并发,怎么控制?
Guava 的 RateLimiter 实现了这个功能,使用方式如下:
private static final ThreadPoolExecutor tx = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS,new LinkedBlockingDeque<>(10),new NamedThreadFactory("yuan-cus", false),new ThreadPoolExecutor.CallerRunsPolicy());public static void main(String[] args) {test(30);}public static void test(int permitsPerSecond) {RateLimiter limiter = ate(permitsPerSecond);//记录上一次执行时间final long[] prev = {System.nanoTime()};//测试执行20次for (Long i = 0L; i < 100; i++) {//提交任务异步执行Long finalI = i;dot("submit No." + i);tx.execute(() -> {double acquire = limiter.acquire();dot("limiter sleep " + acquire * 1000);long cur = System.nanoTime();long interval = (cur - prev[0]) / 1000_000;//打印时间间隔:毫秒dot("Run No. " + finalI + " interval==> " + interval);prev[0] = cur;});}tx.shutdown();}private static void dot(String s) {long millis = System.currentTimeMillis();String name = Thread.currentThread().getName();int size = tx.getQueue().size();int activeCount = tx.getActiveCount();System.out.println("Mills:" + millis + " Thread:" + name + " QueueSize:" + size + "activeCt:" + activeCount + " ==> " + s);}
那么RateLimiter有哪些特点呢?
我以为主要有以下几点:
limiter.setRate(30.0);
本文发布于:2024-02-08 19:54:50,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170739345468551.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |