最近参与公司的服务治理项目,主要目的是为了保证生产服务高可用性,以及高稳定性。
为了更好的参与的这个项目,这段时间一直在充电学习这方面的相关知识,包括限流,熔断,服务降级等等。
那在学习限流的时候,看到网上很多文章中直接使用了JDK 中 Semaphore
实现了限流器。
虽然到达的限流的目的,但是实际上其还是存在很大缺陷。
那你如果没有经过完整测试,直接将这套限流方式照搬过来,发到了生产环境,那就等着背这口大锅吧。
好了,今天我们主要来聊聊 Semaphore
,文章主要内容如下图所示:
semaphore
限流的方式有很多,从类型上分类,一般可以分为两种:
-
并发数限流
-
QPS 限流
并发数限流就是限制同一时刻的最大并发请求数,而 QPS 限流指的是限制一段时间内请求数。
那我们今天的讲的 semaphore
限流其实属于第一类,通过限制并发数,到达限流的目的。
semaphore
中文翻译为信号量,它其实是并发领域中一个重要编程模型,几乎所有支持并发编程的语言都支持信号量这个机制。
JDK 并发包下 Semaphore
类就是信号量的实现类,它的模型比较简单,如下图所示:
Semaphore
内部有一个计数器,我们使用的时候,需要提前初始化。
初始化之后,我们就可以调用 acquire
方法,获取信号量,这时计数器将会减 1。如果此时计数器值小于 0,则会将当前线程阻塞,并且加入到等待队列,否则当前线程继续执行。
执行结束之后,调用 release
方法,释放信号量,计数器将会加 1。那如果此时计数器值的小于或等于0&