作者回复: 你可以使用信号量然后设超时(比如2秒),但调用的服务要花5秒,这个调用线程(容器线程)不能在2秒时主动超时,必然等5秒调用返回,hystrix会标记一次超时,因为你设了2秒超时(虽然实际服务调花5且是成功的)。线程池设2秒超时的话,下面的调用线程(hystrix线程池内线程)会在2秒时主动超时。
作者回复: 受信任服务一般是企业内部开发,性能不至太差,所以用信号量也OK。但是如果服务确实很慢,即使受信任,也要考虑线程池隔离,同时因为在企业内部,我们一般可以要求服务提供方改善性能。第三方的服务我们一般称为不受信,因为性能一般无法把控,可能很慢,我们一般也无法要求第三方改善性能。
作者回复: 一个线程管多个服务,就无法有效隔离,就会有干扰问题。一个服务一般不会同时调很多其它服务,调超>=10服务场景是很少的,即使有,10个线程池开销也不大。只有网关(或某些聚合服务)会大量调其它服务,这时不用线程池,而用信号量。
作者回复: 如果是聚合服务过多(一般在网关上),请使用信号量隔离,不要用线程池,否则会搞出很多线程池开销太大不可控。
作者回复: 建议看hystrix文档对semaphore信号量的解释,内部本质是同步阻塞机制,
https://github.com/Netflix/Hystrix/wiki/How-it-Works
Note: if a dependency is isolated with a semaphore and then becomes latent, the parent threads will remain blocked until the underlying network calls timeout.
作者回复: 一般是以服务为单位进行隔离限流