camel
骆驼通常在分布式环境中用于访问远程资源。 远程服务可能由于各种原因和时期而失败。 对于短时间后暂时不可用且可恢复的服务,重试策略可能会有所帮助。 但是某些服务可能会失败或挂起更长时间,从而使调用应用程序无响应且速度缓慢。 防止级联故障和关键资源耗尽的一个好策略是Michael Nygard在Release It!中描述的断路器模式。 书。断路器是一种有状态模式,用于包装容易发生故障的资源并监视错误。 最初,断路器处于关闭状态,并将所有调用传递给包装的资源。 当故障达到某个阈值时,电路将转为打开状态,在此状态下,错误将错误返回给调用方,而没有实际调用包装的资源。 这样可以防止已经发生故障的资源过载。 在这种状态下,我们需要一种机制来检测故障是否已经结束并开始调用受保护的资源。 这就是所谓的半开状态的第三个状态。 在上次失败之后的一定时间后达到此状态。 在这种状态下,调用将传递到受保护的资源,但是调用的结果很重要。 如果调用成功,则假定受保护的资源已恢复,并且电路进入关闭状态;如果调用失败,则重置超时,并将电路移回到拒绝所有调用的打开状态。 这是Martin Fowler帖子中Circuit Breaker的状态图:
骆驼如何实现断路器?
最新的Camel快照版本中提供了Circuit Breaker作为负载均衡器策略。Camel负载平衡器已经具有用于Round Robin,Random,Failover等的策略,现在也具有CircuiBreaker策略。
这是一个示例负载均衡器,它使用具有2个错误的阈值和1秒的HalfOpenAfter超时阈值的断路器策略。 还要注意,此策略仅适用于由MyCustomException引起的错误
new RouteBuilder() {
public void configure() {
from("direct:start").loadBalance()
.circuitBreaker(2, 1000L, MyCustomException.class)
.to("mock:result");
}
};
这是使用Spring XML DSL的相同示例:
<route>
<from uri="direct:start"/>
<loadBalance>
<circuitBreaker threshold="2" halfOpenAfter="1000">
<exception>MyCustomException</exception>
</circuitBreaker>
<to uri="mock:result"/>
</loadBalance>
</route>
翻译自: https://www.javacodegeeks.com/2014/04/circuit-breaker-pattern-in-apache-camel.html
camel