- 熔断不是为了保护下游系统,熔断也不是为了保护核心流程永远可用,熔断是为了让“A–>B”快速返回,从而避免 ”慢接口消耗过多的php fpm进程或tomcat http线程导致其他接口得不到执行的机会“,最终避免系统雪崩
- 不存在“无法熔断”的接口,熔断的前期就是B已经挂了,”不存在能不能作熔断“的问题。A–>B是网络调用,A的代码一定会处理TimeoutException。所以,至少可以使用“TimeoutException的返回值 来当做 熔断期间的返回值“
1:什么是熔断
A–>B时,B持续失败,于是A判断B出了故障,然后A决定不再调用B了,此时A熔断了。熔断期间,A或者抛出异常(例如:CircuitException),或者A返回某个默认值
注意:熔断发生在主调方
2:什么是降级
我们在系统内部预先埋好开关,在某个时刻打开开关隐藏某些功能,降级后系统提供有损服务。例如:为了保障核心交易链路,黑五期间我们通过预先埋好的开关隐藏退货按钮并显示友好提示;又或者,黑五期间,为了保障数据库性能,关闭掉B端系统的某些报表导出功能(B端和C端共有同一个数据库)。
注意:降级一般是早早埋好的开关。等时x机成熟了就把开关打开
3:什么是熔断降级
”熔断降级”等价于“熔断”。A–>B,A发生了熔断,熔断期间,A总是要返回点啥的,那A返回什么呢?A此时做出的决策就是“熔断降级”策略,A抛异常是一种“熔断降级”策略,A返回某个默认值也是一种“熔断降级”策略。即:
if(尚未熔断){…}
// 已经熔断。下面是所谓的”熔断降级“
else{ throw new CircuritException()或者return defaultValue;}
注意:”熔断降级”等价于“熔断”