分布式熔断设计

67 阅读2分钟

熔断就像电路的保险丝,发生短路会自动跳闸。在分布式系统中,重试的次数太多耗费的时间越大,没有重试的必要了,应该开启熔断操作。

熔断

状态

  • 闭合:失败次数超过计数器设置的次数,切换到断开状态。如果超过超时时间,切换到半断开状态。超时时钟是给系统一次修正错误的机会。
  • 断开:用户发起的请求,后端服务不予理会。可以设置一个全站缓存,直接返回缓存,节省空间。
  • 半开:后端服务允许接收一定数量的请求,如果请求调用成功,说明之前的问题已经修复。切换到闭合状态,把错误计数器重置。如果一定数量的请求中还是有一些错误发生,则认为调用失败问题仍然存在,切换断开状态,重置计数器在修复问题。半断开有效防止正在恢复的服务突然遇到大量请求再次拖垮。

熔断考虑因素

  • 错误类型:有两种方式处理错误,重试和熔断,先尝试重试能否解决,解决不了再熔断。对于耗时较长的服务,直接熔断。
  • 日志监控:记录所有失败和尝试成功的请求
  • 测试服务是否可用:断开状态下,定期ping远程服务的健康检查接口,判断服务是否恢复,不是使用计时器自动切换到半开状态。
  • 手动重置:管理员可以手动切换熔断器状态
  • 并发问题:相同熔断器有可能被大量并发请求同时访问,访问的结果用无锁的数据结构保存
  • 资源分区:资源分布在不同分区,熔断器需要只对有问题的分区熔断,而不是整体
  • 重试错误请求:错误和请求的数据和参数有关系,在半开状态下重试请求服务是否真的恢复