美文网首页后端世界
记一次feign的问题排查(短路、线程池、队列)

记一次feign的问题排查(短路、线程池、队列)

作者: 再无人像你 | 来源:发表于2017-06-02 11:06 被阅读5725次

    昨天开了一百个线程采用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

    相关文章

      网友评论

        本文标题:记一次feign的问题排查(短路、线程池、队列)

        本文链接:https://www.haomeiwen.com/subject/aqwcnttx.html