Hystrix的信号量隔离中信号量是进程所有线程共享的吗?

Hystrix的线程隔离中,信号量隔离中信号量是一个java应用进程所有线程共享的吗?还是也有像线程池那样分开隔离,譬如拥有同一个commandKey属性的请求共享一个信号量?

另外,多个方法上用了@HystrixCommand注解,每个方法都有属性,譬如HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS这种,如果设置的值得不同,而因为这个值又是共享的,那么哪个起作用呢?

阅读 3.4k
3 个回答

按key来的,对应spring cloud就是一个服务名一个信号量,当前java进程中所有请求该服务的请求,都会先经过信号量。

如果不使用@HystrixCommand,直接集成ribbon,一个服务名就是一个信号量。如果使用了@HystrixCommand,那么会一个@HystrixCommand 对应一个信号量。具体你可以断点 AbstractCommand#getExecutionSemaphore()

1.根据commandKey 没有设置根据class
2.设置多个时相同下,应该会使用最先执行的设置的值。参考源码AbstractCommand#getExecutionSemaphore()。实际中应该不太会出现不同的策略。?

信号量本质就是一个静态Map,结构可以简单理解为Map<String, AtomicInteger>,其中key就是commandKey,每收到一个请求就根据commandKey取出对应的计数器加一,处理结束就减一,如果已经达到最大值就fallback

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题