Hystrix的线程隔离中,信号量隔离中信号量是一个java应用进程所有线程共享的吗?还是也有像线程池那样分开隔离,譬如拥有同一个commandKey属性的请求共享一个信号量?
另外,多个方法上用了@HystrixCommand注解,每个方法都有属性,譬如HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS这种,如果设置的值得不同,而因为这个值又是共享的,那么哪个起作用呢?
Hystrix的线程隔离中,信号量隔离中信号量是一个java应用进程所有线程共享的吗?还是也有像线程池那样分开隔离,譬如拥有同一个commandKey属性的请求共享一个信号量?
另外,多个方法上用了@HystrixCommand注解,每个方法都有属性,譬如HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS这种,如果设置的值得不同,而因为这个值又是共享的,那么哪个起作用呢?
1.根据commandKey 没有设置根据class
2.设置多个时相同下,应该会使用最先执行的设置的值。参考源码AbstractCommand#getExecutionSemaphore()。实际中应该不太会出现不同的策略。?
信号量本质就是一个静态Map,结构可以简单理解为Map<String, AtomicInteger>,其中key就是commandKey,每收到一个请求就根据commandKey取出对应的计数器加一,处理结束就减一,如果已经达到最大值就fallback
4 回答1.7k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
4 回答2.2k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答820 阅读✓ 已解决
2 回答1.4k 阅读
按key来的,对应spring cloud就是一个服务名一个信号量,当前java进程中所有请求该服务的请求,都会先经过信号量。
如果不使用
@HystrixCommand
,直接集成ribbon,一个服务名就是一个信号量。如果使用了@HystrixCommand
,那么会一个@HystrixCommand
对应一个信号量。具体你可以断点AbstractCommand#getExecutionSemaphore()