【SpringCloud系列】Hystrix选择信号量策略实现资源隔离 (1)

808 阅读2分钟

Hystrix选择信号量策略实现资源隔离

这是我参与更文挑战的第5天,活动详情查看: 更文挑战

线程池机制文章:

  1. 【Springcloud系列】- Hystrix选择线程池策略实现资源隔离(1)

  2. 【SpringCloud系列】- Hystrix选择线程池策略实现资源隔离(2)

信号量机制与线程池机制的区别

信号量的资源隔离是一个开关的作用,比如:服务A的信号量大小为10,那同时只允许有10个tomcat线程来访问服务A,其他请求都会被拒绝,从而达到资源隔离和限流保护的作用。

线程池隔离技术,是用Hystrix线程池中线程去执行调用,而信号量隔离技术,直接让tomcat线程去调用依赖服务,信号量隔离,只是一道关卡,信号量多少,就允许多少个tomcat线程通过它,然后去执行任务。

信号量、线程池机制流程如下: image.png

设置信号量最大并发量

execution.isolation.semaphore.maxConcurrentRequests 设置使用SEMAPHORE隔离策略允许访问最大并发量,超过这个最大并发量,请求直接被reject 这个并发量的设置,跟线程池大小的设置,但是基于信号量,性能会好很多,而且Hystrix 框架本身开销会小很多。

默认值是10,尽量设置小一些,因为一旦设置太大,而且有延时发生,可能瞬间导致tomcat本身线程资源被占满

HystrixCommandProperties.Setter().withExecutionisolationSemaphoreMaxConcurrentRequests(int value);

信号量、线程池适合业务场景:

线程池技术:适合大多数场景,比如依赖服务的网络请求的调用和访问,需要对调用的timeout进行控制(捕获timeout超时异常) 信号量技术:适合访问不是对外部依赖的访问,而是对内部一些复杂业务逻辑的访问,并且系统内部的代码,其实不涉及任何的网络请求,那只需要做信号量的普通限流即可。 优点:不在管理线程池,不关注timeout超时问题,不需要线程上下文切换。