本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
最近,我看到有人提到限流,然后说可以用信号量来做。我不反对,也不赞成。为什么呢?因为,我认为它们两个不一样,使用的场景不同!
上图来源于网络。
信号量其实很好的理解。就是限制最大的并发数。Java 中 Semaphore 是一个计数信号量,它的本质是一个"共享锁”。
信号量维护了一个信号量许可集。线程可以通过调用 acquire() 来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过 release() 来释放它所持有的信号量许可。
举个例子。假设某一网吧里有 100 台机器,那么最多只能提供 100 个人同时上网,当来了第 101 个客人的时候,就需要等着,一旦有一个人人下机,就可以立马得到了个空机位补上去。这个就是信号量的概念。
而限流呢?我们通常讲限流,讲的都是漏桶算法和令牌桶算法。这两个算法强调的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。
看到这里你应该就明白了,限流限制的是流速。信号量限制的是最大并发数,最终也能达到限流的作用;限流算法限制的是流速。
但是信号量主要存在一个比较明显的问题:在达到permit上限前,系统的 qps 上升是毫无阻力的,瞬间的 qps 可以达到极大值。
这也是为什么有其他限流算法产生的原因。信号量虽然可以达到限流的效果,但是我们一般不用它来做。原因就是我上面提到的。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 说说信号量限流和限流算法的区别