熔断就像电路的保险丝,发生短路会自动跳闸。在分布式系统中,重试的次数太多耗费的时间越大,没有重试的必要了,应该开启熔断操作。
熔断
状态
- 闭合:失败次数超过计数器设置的次数,切换到断开状态。如果超过超时时间,切换到半断开状态。超时时钟是给系统一次修正错误的机会。
- 断开:用户发起的请求,后端服务不予理会。可以设置一个全站缓存,直接返回缓存,节省空间。
- 半开:后端服务允许接收一定数量的请求,如果请求调用成功,说明之前的问题已经修复。切换到闭合状态,把错误计数器重置。如果一定数量的请求中还是有一些错误发生,则认为调用失败问题仍然存在,切换断开状态,重置计数器在修复问题。半断开有效防止正在恢复的服务突然遇到大量请求再次拖垮。
熔断考虑因素
- 错误类型:有两种方式处理错误,重试和熔断,先尝试重试能否解决,解决不了再熔断。对于耗时较长的服务,直接熔断。
- 日志监控:记录所有失败和尝试成功的请求
- 测试服务是否可用:断开状态下,定期ping远程服务的健康检查接口,判断服务是否恢复,不是使用计时器自动切换到半开状态。
- 手动重置:管理员可以手动切换熔断器状态
- 并发问题:相同熔断器有可能被大量并发请求同时访问,访问的结果用无锁的数据结构保存
- 资源分区:资源分布在不同分区,熔断器需要只对有问题的分区熔断,而不是整体
- 重试错误请求:错误和请求的数据和参数有关系,在半开状态下重试请求服务是否真的恢复