最近,我看到有人提到限流,然后说可以用信号量来做。我不反对,也不赞成。为什么呢?因为,我认为它们两个不一样,使用的场景不同!
上图来源于网络。
信号量其实很好的理解。就是限制最大的并发数。Java 中 Semaphore 是一个计数信号量,它的本质是一个"共享锁”。
信号量维护了一个信号量许可集。线程可以通过调用 acquire() 来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过 release() 来释放它所持有的信号量许可。
举个例子。假设某一网吧里有 100 台机器,那么最多只能提供 100 个人同时上网,当来了第 101 个客人的时候,就需要等着,一旦有一个人人下机,就可以立马得到了个空机位补上去。这个就是信号量的概念。
而限流呢?我们通常讲限流,讲的都是漏桶算法和令牌桶算法。这两个算法强调的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。
看到这里你应该就明白了,限流限制的是流速。信号量限制的是最大并发数,最终也能达到限流的作用;限流算法限制的是流速。
但是信号量主要存在一个比较明显的问题:在达到permit上限前,系统的 qps 上升是毫无阻力的,瞬间的 qps 可以达到极大值。
这也是为什么有其他限流算法产生的原因。信号量虽然可以达到限流的效果,但是我们一般不用它来做。原因就是我上面提到的。
: » 说说信号量限流和限流算法的区别
原创文章,作者:dweifng,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/252816.html