九、Hystrix线程池
Hystrix把服务调用统称为依赖调用,Hystrix通过命令模式封装依赖调用,每一个依赖调用封装在HystrixCommand中,每个命令在Hystrix的线程池中运行。另外可以对其配置分组名、线程组,使得不同的依赖可以分类在不同的线程组,隔离不同模块的依赖,也可根据负载情况,配置不同组的线程数。
命令名称HystrixCommandKey
HystrixCommand的名字,比如可以是某远程服务名,如查询购物车、查询订单等。如果不设置这个名字,Hystrix会为其设置默认的名字:类名。
命令分组HystrixCommandGroupKey
通过设置命令组,Hystrix会根据组来组织和统计命令的告警、仪表盘等信息。一定要设置命令组,因为除了根据组为统计单位外,如果当未设置HystrixThreadPoolKey值时,Hystrix会让相同组名的线程使用同一个线程池,因此需要在创建Hystrix命令时为其指定命令组名来实现默认的线程池划分。
线程池HystrixThreadPoolKey
ThreadPoolKey是HystrixCommand运行所在的线程池,如果该参数不设置则使用GroupKey作为ThreadPoolKey,这种情况下往往是同一个业务模块的依赖调用在同一个线程池内,比如使用服务模块[user,order,product等]作为GroupKey,此时如果同一业务内的服务之间还需要隔离的话,就可以设置该参数,比如order的订单和购物车可以通过设置不同的ThreadPoolKey再区分到不同线程池中,这在应对高并发时可以带来较好的效果,因为订单某些查询时比较慢的,如果和购物车放在同一个线程池回影响购物车的速率,同时也可以把下单接口单独隔离。
例如:
Hystrix内部是将创建好的线程池(即HystrixThreadPoolDefault内部封装了ThreadPoolExecutor的实例)是被放入到ConcurrentHashMap中:
final static ConcurrentHashMap<String, HystrixThreadPool> threadPools = new ConcurrentHashMap<String,HystrixThreadPool>();
threadPools.put(HystrixThreadPoolKey,new HystrixThreadPoolDefault(HystrixThreadPoolKey,propertiesBuilder));
|
具体流程如下图: