面试题答案
一键面试常见手段及其原理
- 线程池隔离
- 原理:为每个服务调用分配独立的线程池。当某个服务请求量激增时,只会耗尽该服务对应的线程池资源,而不会影响其他服务的线程池。例如,假设有服务A和服务B,它们分别使用独立的线程池。如果服务A的请求过多导致其线程池满了,服务B的请求依然可以正常使用自己的线程池来处理,从而实现服务隔离。
- 信号量隔离
- 原理:通过控制并发访问的信号量数量来实现隔离。每个服务调用需要获取一个信号量,如果信号量已被占满,则新的请求无法获取信号量而被拒绝。比如设定服务C的信号量上限为10,那么同时最多只能有10个对服务C的请求进行处理,超过10个的请求就会被拒绝,以此避免因过多请求导致服务过载,影响其他服务。
Hystrix实现服务隔离
- 线程池隔离
- 工作方式:Hystrix为每个依赖服务创建独立的线程池。当调用依赖服务时,Hystrix将请求提交到该依赖服务对应的线程池。例如,若有一个微服务调用了支付服务和库存服务,Hystrix会为支付服务和库存服务分别创建不同的线程池。
- 优点:能有效隔离故障,一个依赖服务的线程池耗尽不会影响其他依赖服务;还可以通过调整线程池参数(如线程数量、队列大小等)来优化资源使用。
- 缺点:线程上下文切换会带来额外开销,创建过多线程池会消耗较多系统资源。
- 信号量隔离
- 工作方式:Hystrix使用信号量来限制对依赖服务的并发调用数量。在调用依赖服务前,Hystrix尝试获取信号量,如果获取成功则可以调用服务,调用完成后释放信号量;若获取失败,则直接拒绝请求并走降级逻辑。
- 优点:开销小,适用于低延迟的依赖服务,因为它避免了线程上下文切换的开销。
- 缺点:无法完全隔离故障,若某个请求长时间占用信号量,可能导致其他请求一直无法获取信号量而被拒绝。