隔离方案
对于服务隔离,常见的隔离方案有:
- 线程隔离:
- 在同一个进程里,可以区分不同的服务方法,对于核心的服务方法,用单独的线程池执行核心的服务方法,确保在特定线程池出现故障时,不会影响到其他线程池资源。
- 除此之外,可以有另外一个隔离纬度,如对特定服务方法的执行时间进行统计,对于执行时间长的服务方法,放在一个独立的慢线程池处理,其他放在默认线程池处理。
- 进程隔离/读写服务隔离:读服务流量大,和读服务进行隔离,用不同的进程部署,核心服务与非核心服务也可以进行隔离,避免相互影响。
- 分组隔离,对于一条完整的调用链路,对每一个链路节点划分出一个个分组,未划分的都归为默认分组。这样,特定分组的上游服务会调用特定分组的下游服务,不同分组的服务实现逻辑可能一致,但调用互不干扰,达到了调用链路的隔离,以便在不同的链路完成不同的需求,如全链路压测、beta测试,灰度测试等。
- 集群隔离。又或者出于安全或其他因素考虑,限制服务只能在同机房或同网域下访问。
- 资源隔离:如隔离核心服务和非核心服务在不同的网络带宽,避免非核心服务的带宽占用影响核心服务访问
对于除线程隔离外的其他隔离方案,笔者没有太多的实践经验,这里主要看看基于线程隔离和后续的分组隔离的相关实现。
线程隔离
在RPC服务中,可以根据服务方法的不同特性或调用情况,为特定的服务方法配置指定配置的线程池,如根据服务方法是否核心、读或写操作,方法执行快慢等特性,用不同线程池进行隔离。
参考Pigeon比较好的一个实践,是将服务方法和线程池配置的对应关系放到配置中心。在程序中监听配置变更,来为不同服务方法动态创建相关配置的线程池,来达到对线上服务流量的动态隔离。
具体配置示例如下:
- 配置特定参数的线程池:
[ { "poolName" : "pool1", "corePoolSize" :