美文网首页
Guava RateLimiter限流

Guava RateLimiter限流

作者: 可爱的尖椒肉丝 | 来源:发表于2019-08-28 10:29 被阅读0次
为什么有这篇文章

在负责某个项目开发过程中,在定时任务(job)里面调用了公司的内部某个微服务,进行财务流水生成,在被调用方能力处理不及时的时候,引发被调用方宕机奔溃,故此在客户端,即Job做简单的限流,于是针对此场景进行调研,发现Guava RateLimiter在此种场景下,简单且高效。

模拟调用示例
    public static void main(String[] args) {
        // 模拟10次调用
        int a = 10;
        while (true) {
            // 调用的当前时间
            LocalTime now = LocalTime.now();
            System.out.println("模拟调用三方微服务,当前时间为:" + now.toString());
            a--;
            if (a == 0) {
                break;
            }
        }
    }
模拟调用三方微服务,当前时间为:10:16:22.088
模拟调用三方微服务,当前时间为:10:16:22.089
模拟调用三方微服务,当前时间为:10:16:22.089
模拟调用三方微服务,当前时间为:10:16:22.089
模拟调用三方微服务,当前时间为:10:16:22.089
模拟调用三方微服务,当前时间为:10:16:22.089
模拟调用三方微服务,当前时间为:10:16:22.089
模拟调用三方微服务,当前时间为:10:16:22.089
模拟调用三方微服务,当前时间为:10:16:22.089
模拟调用三方微服务,当前时间为:10:16:22.089

由本示例可以了解到,在 10:16:22 内完成了 10次调用,本次调用过程中对于调用方的并发处理能力要求很高,如果调用方没有做限流等操作的话,在业务高峰期,调用方很容易崩溃,当然我们如果作为调用方的话,也需要做简单的限流操作:推荐使用 sentine https://sentinelguard.io/zh-cn/docs/open-source-framework-integrations.html

客户端调用按照RateLimiter限流限流示例
public static void main(String[] args) {
        //初始化 每秒1个令牌
        RateLimiter rateLimiter = RateLimiter.create(1);
        int a = 10;
        while (true) {
            //每次需要1个令牌
            rateLimiter.acquire(1);
            LocalTime now = LocalTime.now();
            System.out.println("模拟调用三方微服务,当前时间为:" + now.toString());
            a--;
            if (a == 0) {
                break;
            }
        }
    }
模拟调用三方微服务,当前时间为:10:24:10.257
模拟调用三方微服务,当前时间为:10:24:11.176
模拟调用三方微服务,当前时间为:10:24:12.177
模拟调用三方微服务,当前时间为:10:24:13.177
模拟调用三方微服务,当前时间为:10:24:14.180
模拟调用三方微服务,当前时间为:10:24:15.180
模拟调用三方微服务,当前时间为:10:24:16.175
模拟调用三方微服务,当前时间为:10:24:17.180
模拟调用三方微服务,当前时间为:10:24:18.179
模拟调用三方微服务,当前时间为:10:24:19.177

我们可以看到限流后的服务调用记录,在10-19秒内,每秒调用一次,服务调用平稳,并无瞬时的高峰,缓解了调用方的服务压力,不会无缘无故背锅。

RateLimiter源码分析

持续更新中....

相关文章

网友评论

      本文标题:Guava RateLimiter限流

      本文链接:https://www.haomeiwen.com/subject/oozuectx.html