说说信号量限流和限流算法的区别

业余杂谈 herman 367浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

最近,我看到有人提到限流,然后说可以用信号量来做。我不反对,也不赞成。为什么呢?因为,我认为它们两个不一样,使用的场景不同!

信号量

上图来源于网络。

信号量其实很好的理解。就是限制最大的并发数。Java 中 Semaphore 是一个计数信号量,它的本质是一个"共享锁”。

信号量维护了一个信号量许可集。线程可以通过调用 acquire() 来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过 release() 来释放它所持有的信号量许可。

举个例子。假设某一网吧里有 100 台机器,那么最多只能提供 100 个人同时上网,当来了第 101 个客人的时候,就需要等着,一旦有一个人人下机,就可以立马得到了个空机位补上去。这个就是信号量的概念。

而限流呢?我们通常讲限流,讲的都是漏桶算法和令牌桶算法。这两个算法强调的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

看到这里你应该就明白了,限流限制的是流速。信号量限制的是最大并发数,最终也能达到限流的作用;限流算法限制的是流速。

但是信号量主要存在一个比较明显的问题:在达到permit上限前,系统的 qps 上升是毫无阻力的,瞬间的 qps 可以达到极大值。

这也是为什么有其他限流算法产生的原因。信号量虽然可以达到限流的效果,但是我们一般不用它来做。原因就是我上面提到的。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 说说信号量限流和限流算法的区别