zyearn commented on a change in pull request #684: add doc for circuit breaker URL: https://github.com/apache/incubator-brpc/pull/684#discussion_r264505515
########## File path: docs/cn/circuit_breaker.md ########## @@ -0,0 +1,62 @@ +# 熔断功能 +当我们发起一个rpc之后,brpc首先会从名字服务(naming service)拿到一个可用节点列表,之后根据负载均衡策略挑选出一个节点作为实际访问的节点。当某个节点出现故障时,brpc能够自动将它从可用节点列表中剔除,并周期性的对故障节点进行健康检查。 + +# 保守的熔断策略 +brpc 默认会提供保守的熔断策略,在保守的熔断策略下,brpc只有在发现节点无法建立连接时才会将该节点熔断。当某一次rpc返回以下错误时,brpc会认为目标节点无法建立连接,并进行熔断:ECONNREFUSED 、ENETUNREACH、EHOSTUNREACH、EINVAL。 + +这里需要指出的是,假如brpc发现某个节点出现连续三次连接超时(而不是rpc超时),那么也会把第三次超时当做ENETUNREACH来处理。所以假如rpc的超时时间设置的比连接超时更短,那么当节点无法建立连接时,rpc超时会比连接超时更早触发,最终导致永远触发不了熔断。所以在自定义超时时间时,需要保证rpc的超时时间大于连接超时时间。即ChannelOptions.timeout_ms > ChannelOptions.connect_timeout_ms。 + +保守的熔断策略是一直开启的,并不需要做任何配置,也无法关闭。 + +# 更激进的熔断策略 +仅仅依赖上述保守的熔断策略有时候并不能完全满足需求,举个极端的例子: 假如某个下游节点逻辑线程全部卡死,但是io线程能够正常工作,那么所有的请求都会超时,但是tcp连接却能够正常建立。对于这类情况,brpc提供了更加激进的熔断策略:当某个节点的出错率高于预期值时,也会主动将该节点进行摘除。 + +## 开启方法 +激进的熔断策略默认是关闭的,用户可以根据需要在ChannelOptions中手动开启: +``` +brpc::ChannelOptions option; +option.enable_circuit_breaker = true; +``` + +## 工作原理 +激动的熔断由CircuitBreaker实现,在开启了熔断之后,CircuitBreaker会记录每一个请求的处理结果,并维护一个累计出错时长,记为acc_error_cost,当acc_error_cost > max_error_cost时,熔断该节点。 + + +**error_cost的计算过程如下:** +1. 如果请求处理成功,则令 acc_error_cost = alpha * acc_error_cost (alpha 为常数,由window_size决定) +2. 如果请求处理失败,则令 acc_error_cost = acc_error_cost + 该次请求的latency Review comment: 代码里是error_cost = std::min(ema_latency * max_mutiple, error_cost) 似乎和这里对不上,或者说下面那段”考虑到超时等错误..."是不是放在这里比较合适 ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: [email protected] With regards, Apache Git Services --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
