Guava之RateLimiter如何限流

阅读: 评论:0

Guava之RateLimiter如何限流

Guava之RateLimiter如何限流

前言

流量控制是老生常谈的话题,包括两方面:

  1. 对本系统的保护。位于业务系统的最前面;
  2. 对外部调用的并发控制。处于系统的底层;

大部分系统聊的都是前者,今天我们聊聊后者。

背景

请求外部服务,或者做批量数据同步,下游依赖服务有最大并发控制,不想接口因为限流而失败,同时又想尽可能的提高并发,怎么控制?

实战

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有哪些特点呢?
我以为主要有以下几点:

  1. 单机
  2. 基于内存
  3. 均匀的时间窗口
  4. 可以动态调整
limiter.setRate(30.0);

本文发布于:2024-02-08 19:54:50,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739345468551.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Guava   RateLimiter
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23