Hystrix选择信号量策略实现资源隔离
这是我参与更文挑战的第5天,活动详情查看: 更文挑战
线程池机制文章:
信号量机制与线程池机制的区别
信号量的资源隔离是一个开关的作用,比如:服务A的信号量大小为10,那同时只允许有10个tomcat线程来访问服务A,其他请求都会被拒绝,从而达到资源隔离和限流保护的作用。
线程池隔离技术,是用Hystrix线程池中线程去执行调用,而信号量隔离技术,直接让tomcat线程去调用依赖服务,信号量隔离,只是一道关卡,信号量多少,就允许多少个tomcat线程通过它,然后去执行任务。
信号量、线程池机制流程如下:
设置信号量最大并发量
execution.isolation.semaphore.maxConcurrentRequests 设置使用SEMAPHORE隔离策略允许访问最大并发量,超过这个最大并发量,请求直接被reject 这个并发量的设置,跟线程池大小的设置,但是基于信号量,性能会好很多,而且Hystrix 框架本身开销会小很多。
默认值是10,尽量设置小一些,因为一旦设置太大,而且有延时发生,可能瞬间导致tomcat本身线程资源被占满
HystrixCommandProperties.Setter().withExecutionisolationSemaphoreMaxConcurrentRequests(int value);
信号量、线程池适合业务场景:
线程池技术:适合大多数场景,比如依赖服务的网络请求的调用和访问,需要对调用的timeout进行控制(捕获timeout超时异常) 信号量技术:适合访问不是对外部依赖的访问,而是对内部一些复杂业务逻辑的访问,并且系统内部的代码,其实不涉及任何的网络请求,那只需要做信号量的普通限流即可。 优点:不在管理线程池,不关注timeout超时问题,不需要线程上下文切换。