背景
项目中遇到了一个关于Feign调用问题,在并发200左右的情况下 A服务 通过feign 调用 B服务,抛出了异常
https://blog.csdn.net/weixin_39513166/article/details/106613430
异常说明
could not acquire a semaphore for execution and fallback failed.
解决的思路与原因
线上环境Feign 采用 信号量模式 ,也就意味只允许多少并发请求过来,所以过多的请求过来会超时
关于Feign 与 Hystrix 请参考文档 https://blog.csdn.net/weixin_39513166/article/details/106613430
* 自定义Feign的隔离策略;
* 在转发Feign的请求头的时候,如果开启了Hystrix,Hystrix的默认隔离策略是Thread(线程隔离策略),
* 因此转发拦截器内是无法获取到请求的请求头信息的,
* 可以修改默认隔离策略为信号量模式:hystrix.command.default.execution.isolation.strategy=SEMAPHORE,
* 这样的话转发线程和请求线程实际上是一个线程,这并不是最好的解决方法,信号量模式也不是官方最为推荐的隔离策略;
* 另一个解决方法就是自定义Hystrix的隔离策略,思路是将现有的并发策略作为新并发策略的成员变量,在新并发策略中,返回现有并发策略的线程池、Queue;将策略加到Spring容器即可;
解决方案
调整线程池的大小与请求数
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 500000
fallback:
isolation:
strategy: SEMAPHORE
semaphore:
maxConcurrentRequests: 4000
threadpool:
default:
coreSize: 200
ribbon:
ReadTimeout: 20000
ConnectTimeout: 20000