熔断器(circuit breaker)包含在电路设备中,用于防止过载或短路的组件。常见于洗衣机、电热水壶、烤机等。今天所讲的比这个稍微复杂一些。
一个熔断器包含下面的功能:
- 当所有情况正常,它的状态为
closed
,让电流(electricity)或数据(data)流通。 - 当探测到过载(overload)或短路(short circuit),熔断器跳闸(
trips
)进入open
状态,不让任何东西流通。 - 一段时间后,熔断器会自动进入
half-open
状态,探测(probing)是否恢复正常。如果电流(或数据流)正常,熔断器进入open
状态。
因为远程调用和内存(in-memory)调用不同,远程调用会出现超时和挂掉的情况。软件服务间需要提供一种响应式的设计。Michael Nygard 发表了一篇文章阐述了Circuit Breaker pattern
来防护这种灾难性的级联发生。
和电路上的熔断器又些许不同,熔断器模式包含下面状态改变的规则:
- 在
closed
状态,熔断器统计失败的次数或 事先定义好的callTimeout
的次数。如果失败的次数到达设定的阈值(maxFailures or thresholds),跳闸。任何调用都应该在计数(counter)重置为0时才能成功访问。 - 在
open
状态,熔断器闲置(idles until)执行到配置的resetTimeout
时间,随后进入half-open
状态。 - 在
half-open
状态,如果第一次尝试调用仍然失败,它重新跳闸到open
状态;如果第一次调用成功了,熔断器重置为closed
状态,restTimeout
被重置。
¶Reactive Design
最早的响应式宣言宣布于2013年6月。它是响应式应用的软件架构描述。它包含下面4个特点:
- Responsive —— React to users (快速检测并高效处理问题)
- Scalable(Elastic) —— React to load (弹性控制,大部分实现依赖于硬件和软件平台)
- Resilient —— React to failure (有回复,受控制,隔离,委派)
- Event-driven —— React to events (异步消息,确保松耦合,隔离,位置透明。非阻塞的交互服务)
一些实现方式:
- 请求回复链路:
- 我们的设计: