Timeout Retry Circuit Breaker 我该用哪个

查看原文

本文是 @abrookins 做的一个实验,在他的实验中,他测试了诸如超时,重试,断路器等技巧对系统健壮性的影响。tldr, 结论:高并发带依赖的服务,不要重试,用尽可能短的 timeout,发请求时包在 circuit beaker 里面。

  • 上游服务宕机
    • API Gateway Only: 如果下游服务只是简单地在 Connection Error 的时候捕获错误做一些默认值的处理,那么,对系统处理能力影响几乎微乎其微。主要是因为 socket error 报错是实时的,这时断路器和超时用上了也没用。
    • Circuit Breakers, 不设置超时,遇到了上游服务宕机,跟上面没差。
  • 上游服务器宕机
    • No Timeouts, No Circuit Breakers, Boom,系统处理能力直接降到十几个请求。这个很容易理解:当前服务所有的处理能力都卡在那少数的几个上游服务的请求,而这些请求就 Hang 在那里了。
    • 只开启了 Circuit Breakers:同上。因为这些请求就 Hang 在那里,也算不得错误,熔断器不会有状态改变。
    • 只把 Timeouts 开到 5 秒会怎样?也不怎样,跟上面差不多。
    • 只开 Retry,同上。而且非常不建议 Retry 不带上 jitter backoff(等一会儿再发请求)。
    • 把 Retry 开了,然后 Timeouts 开到 0.5 秒会怎样?也不怎样,跟上面差不多。
    • 把 Circuit Breakers 开了,然后 Timeouts 开到 0.5 秒呢?完美,服务并发量没丢,上游服务也不会被大流量击垮。