各位朋友,今天咱们来聊聊分布式中的信号量隔离。上一期咱们讲了线程池隔离,这一期咱们接着说信号量隔离。

信号量隔离应用广泛,场景和线程池隔离差不多,都能对方法级、接口级做隔离。它的原理很简单,比如设置 1000 个信号量,请求过来先取一个信号,拿到才能访问下游服务,完成后释放信号。要是 1000 个信号都占满了,新进来的请求就会被拒之门外,走降级方法提示稍后再试。

可能有人会问,信号量隔离和线程池隔离听起来差不多,都有隔离容量,都走熔断和降级,这两者到底有啥区别?

线程池隔离相对较重,为单个方法专门设置隔离线程池,适用于查询量和计算量较大、较复杂的方法,能保证有充足线程保障业务运行。它是异步处理方式,设有超时时间,过期直接释放线程。

而信号量属于轻量级计数器,是同步处理方式。要是针对计算和查询量大的方法,会有很多信号量被占用,容易快速熔断,所以不太适合。信号量隔离更适合轻量查询或者接口返回快的情况,比如 Redis 查询,或者处理计算量小的业务,能快速释放信号量,让更多请求进来,一定程度上符合大并发要求。

现在很多组件在隔离方面做得不错,像 Spring Cloud Hystrix、福报厂的 Sentinel 等,都支持信号量或线程池隔离,大家可以根据业务场景选用,也能自己实现。另外,信号量隔离机制除了方法级,在网关层也用得多,像某个网关能在网关层对请求量做信号量隔离,针对不同服务中心,比如用户中心、商城中心、订单中心,可以分配不同数量的信号量,比如商城中心访问量高,就多分配些。

好了,今天关于信号量隔离就讲到这儿,要是您对本期内容有啥疑问,欢迎在评论区留言!