记一次feign的问题排查(短路、线程池、队列) |
您所在的位置:网站首页 › feign客户端线程数限制 › 记一次feign的问题排查(短路、线程池、队列) |
昨天开了一百个线程采用feign去请求第三方项目,结果报错,出现了短路,大概是下面这样的。(feign整合了hystrix并且自动打开了熔断器) Hystrix circuit short-circuited and is OPEN 。。。。。 百度了一下,几乎没人碰到这个问题,于是去谷歌了,发现还真有人碰到这个问题。引起这个问题的原因是在一个滚动窗口内,失败了二十个(默认),就会发生短路,短路时间默认为5秒,5秒之内拒绝所有的请求,之后开始运行。然后解决办法如下: 设置熔断器失败的个数,默认为20个,这里我给了1000个,只有超过1000个才会发生短路。hystrix详细具体的配置信息可以谷歌一下,hystrix的配置。 hystrix.command.default.circuitBreaker.requestVolumeThreshold=1000 没错,当我设置完成之后,没有出现短路的情况,但是出现了 hystrix could not be queued for execution and no fallback available. exo me? 不能队列执行?又去谷歌了一下,发现是feign线程池的问题,因为feign默认的线程池大小为10个,我却用了一百个线程,下面是github大佬的回答。 去官方文档看了下,解决办法是设置feign的核心线程池的数量。下面那个maxQueueSize可以不用设置,默认为-1,使用的是SynchronousQueue。 hystrix.threadpool.default.coreSize=100 #hystrix.threadpool.default.maxQueueSize=1000 设置完成之后,又出现了一个问题,没错,又是time-out。 对于这个问题很好解决,设置断路器的超时,前面写过一篇在有道云笔记里面。为了偷懒还是复制一下代码吧 #断路器超时设置和请求的超时 hystrix.command.default.execution.timeout.enabled=true hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=300000 ribbon.ConnectTimeout=300000 ribbon.ReadTimeout=300000 现在就解决了。 原因:出现timeout的问题,基于我的理论,当然只是基于我的空想。 因为我请求的是一百个线程去访问,我们知道CPU的线程是上下文切换的,有些线程迟迟得不到执行权,就一直挂在那里了,一直挂,一直挂,直到满足了断路器的timeout,然后就被抛出异常了,这个线程也是很可怜QAQ。 后面采用了fallback,发现会拒绝执行fallback,原因也是线程太少,设置一下回退的线程数量就好了。 #设置回退的最大线程数 hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=50 转载:https://www.jianshu.com/p/f7fb59f43485 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |