在面试dubbo的时候,会被问到Dubbo限流是如何做的这个问题,今天我就来说说这个问题。
在说之前,要说明一件事情,要想理解所有的与dubbo相关的文章,首先就是要理解dubbo内部是如何运行的,也就是它的机制如何,同样,要想理解本文,首先得理解dubbo的运行机制,由于这块内容非常庞大,无法在此文中讲解,所以我假设读者是在已经理解dubbo原理的基础上阅读本文的。
Dubbo中的限流是如何做的?
dubbo源码中有一个过滤器叫做TPSLimitFilter,用于判断单位时间请求数是否超过上限,如果超过,抛出异常阻断调用,否则就放行。 先看代码
源码是不是很简单,把判定过程交给TPSLimiter去完成,如果不被允许,就抛出异常,否则就往下调用执行。
那么TPSLimitFilter是如何工作的呢,再看代码
其中StateItem类的核心实现isAllowable如下
代码显示,它使用了一个ConcurrentHashMap来完成对每一个接口的计数,也就是说它使用了最简单的计数器算法,但是这种简单是有代价的,就是如果并发流量刚好在上个计数器最后一秒和下个计数器第一秒来临,那么就不能完全预防突发流量。网上推荐自己使用令牌桶算法或漏桶算法实现自定义限流Filter,另外分布式限流也是个不错的参考。