https://www.jianshu.com/p/f7fb59f43485git
昨天开了一百个线程采用feign去请求第三方项目,结果报错,出现了短路,大概是下面这样的。(feign整合了hystrix而且自动打开了熔断器)github
Hystrix circuit short-circuited and is OPENui
。。。。。spa
百度了一下,几乎没人碰到这个问题,因而去谷歌了,发现还真有人碰到这个问题。引发这个问题的缘由是在一个滚动窗口内,失败了二十个(默认),就会发生短路,短路时间默认为5秒,5秒以内拒绝全部的请求,以后开始运行。而后解决办法以下:线程
设置熔断器失败的个数,默认为20个,这里我给了1000个,只有超过1000个才会发生短路。hystrix详细具体的配置信息能够谷歌一下,hystrix的配置。orm
hystrix.command.default.circuitBreaker.requestVolumeThreshold=1000队列
没错,当我设置完成以后,没有出现短路的状况,可是出现了ci
hystrix could not be queued for execution and no fallback available.文档
exo me? 不能队列执行?又去谷歌了一下,发现是feign线程池的问题,由于feign默认的线程池大小为10个,我却用了一百个线程,下面是github大佬的回答。it
去官方文档看了下,解决办法是设置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
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
zuul组件封装了feign,重改了feign的默认配置,因此相同状况下不会出现
Hystrix circuit short-circuited and is OPEN 等到问题