这周在项目中遇到了一个错误,就是Circuit Breaker time out。以前没有接触过,因此学习了下akka的断路器。

一、为什么使用Circuit Breaker

断路器是为了防止分布式系统中的级联故障,从而保障其稳定性。其应该与远程系统之间接口的明智超时结合使用,以防止单个组件故障导致所有组件关闭。

例如,我们有一个与第三方远程Web服务交互的应用程序。假设请求超出了第三方的容量,他们的数据库在负载下不能正常工作了。假设数据库以这样的方式失败,即将错误交还给第三方Web服务需要很长时间。这反过来使得请求在很长一段时间后失败。回到我们的Web应用程序,用户已经注意到他们的表单提交需要更长时间才能挂起。而用户一般会不断的使用刷新按钮,为他们已经运行的请求添加更多请求。这最终导致由于资源耗尽而导致Web应用程序失败。这将影响所有用户,即使那些未依赖于此第三方Web服务功能的用户也是如此。

因此,在Web服务调用中引入断路器将导致请求开始快速失败,让用户知道出现问题并且他们不需要刷新他们的请求。这也将故障行为限制为仅使用依赖于第三方功能的用户,其他用户不再受资源耗尽而受影响。

我们都知道在springcloud中hystrix。同样的在akka中也提供了自己的熔断措施,即akka.pattern.CircuitBreaker

二、断路器的几种状态

在正常操作期间,断路器处于闭合状态:

(1)超出配置的callTimeout的异常或调用会增加失败计数器

(2)成功将故障计数重置为零

(3)当故障计数器达到maxFailures计数时,断路器跳闸到打开状态

处于打开状态时:

(1)所有呼叫都是快速失败的 CircuitBreakerOpenException

(2)在配置的resetTimeout之后,断路器进入半开状态

在半开状态时:

(1)允许第一次尝试通过而不会快速失败

(2)所有其他调用失败快速,异常与打开状态一样

(3)如果第一次调用成功,则断路器将重置为Closed状态并重置resetTimeout

(4)如果第一次呼叫失败,则断路器再次跳闸到开路状态(对于指数退避断路器,resetTimeout乘以指数退避因子)

其各状态之间之间的转换如下图所示:

三、例子

class DangerousActor extends Actor with ActorLogging {
import context.dispatcher val breaker =
new CircuitBreaker(
context.system.scheduler,
//最大失败次数设置为5
maxFailures = 5,
//超时时间设置为5s
callTimeout = 10.seconds,
//重置超时为1分钟
resetTimeout = 1.minute).onOpen(notifyMeOnOpen()) def notifyMeOnOpen(): Unit =
log.warning("My CircuitBreaker is now open, and will not close for one minute")
//#circuit-breaker-initialization //#circuit-breaker-usage
def dangerousCall: String = "This really isn't that dangerous of a call after all" def receive = {
case "is my middle name" ⇒
breaker.withCircuitBreaker(Future(dangerousCall)) pipeTo sender()
case "block for me" ⇒
sender() ! breaker.withSyncCircuitBreaker(dangerousCall)
}
//#circuit-breaker-usage }

在该示例中,我们使用了withCircuitBreaker一个异步方法(该方法返回一个Future),例如从数据库中检索数据的调用,然后将结果传回给发送方。如果由于某种原因,此示例中的数据库没有响应,或者存在另一个问题,则断路器将打开并停止尝试一次又一次地击中数据库,直到超时结束。

Akka之Circuit Breaker的更多相关文章

  1. Circuit Breaker Pattern(断路器模式)

    Handle faults that may take a variable amount of time to rectify when connecting to a remote service ...

  2. Circuit Breaker Features

    Better to use a circuit breaker which supports the following set of features: Automatically time-out ...

  3. 谈谈Circuit Breaker在.NET Core中的简单应用

    前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不了服务之间的相互调用问题!如果调用没有处理好,就有可能造成整个系统的 ...

  4. Circuit Breaker模式

    Circuit Breaker模式会处理一些需要一定时间来重连远程服务和远端资源的错误.该模式可以提高一个应用的稳定性和弹性. 问题 在类似于云的分布式环境中,当一个应用需要执行一些访问远程资源或者是 ...

  5. [AOP] 7. 一些自定义的Aspect - Circuit Breaker

    Circuit Breaker(断路器)模式 关于断路器模式是在微服务架构/远程调用环境下经常被使用到的一个模式.它的作用一言以蔽之就是提高系统的可用性,在出现的问题通过服务降级的手段来保证系统的整体 ...

  6. .NET Core中Circuit Breaker

    谈谈Circuit Breaker在.NET Core中的简单应用 前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不 ...

  7. 55.fielddata内存控制以及circuit breaker断路器

    课程大纲 fielddata加载 fielddata内存限制 监控fielddata内存使用 circuit breaker 一.fielddata加载 fielddata加载到内存的过程是lazy加 ...

  8. 再探Circuit Breaker之使用Polly

    前言 上一篇介绍了使用Steeltoe来处理服务熔断,这篇我们将用Polly来处理服务熔断. 不废话了,直接进正题. 简单的例子 同样先定义一个简单的服务. [Route("api/[con ...

  9. Steeltoe之Circuit Breaker篇

    在分布式系统中,服务发生异常是很正常的现象.为了处理这类"例外",可以采取不同的应对策略,断路器模式即是其中一种方法.这个模式的主要特点是其可以阻断失败的级联影响,不会因为一个服务 ...

随机推荐

  1. Java面试——多线程面试题总结

    )两者都在等待对方所持有但是双方都不释放的锁,这时便会一直阻塞形成死锁. //存放两个资源等待被使用 public class Resource { public static Object obj1 ...

  2. 数据结构之B-树

    作为文件系统索引的常用数据结构,B-树的查找涉及硬盘和内存两个部分,硬盘的读写将影响查找的速度.传统关系型数据库如Mysql采用B-树作为索引,新型内存数据库levledb通过改进数据组织方式通过内存 ...

  3. 11、JQuery知识点总结

    1.JQuery简介 JQuery 是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作 jQuery有下列特色: 跨浏览器的DOM元素选择 DOM巡访与更改:支持CS ...

  4. leetcode 【 Best Time to Buy and Sell Stock 】python 实现

    思路: Say you have an array for which the ith element is the price of a given stock on day i. If you w ...

  5. Windows 7中安装SQL2005提示IIS未安装 解决办法 .(转载)

    在Windows 7系统中安装SQL Server 2005时,可能会收到一个警告:提示IIS未安装或者未启用.在通过“控制面板”的“打开或关闭Windows功能”按默认设置安装IIS后,发现仍有这个 ...

  6. vs编译生成之后报错

    严重性 代码 说明 项目 文件行 禁止显示状态 错误 CS2001 Source file 'D:\Local\Apright_LW-Wiseb2b\Feekong.Model\obj\Release ...

  7. POJ 3254:Corn Fields(状态压缩DP)

    题目大意:一个矩形的草地,分为多个格子,有的格子可以有奶牛(标为1),有的格子不可以放置奶牛(标为0),计算摆放奶牛的方案数. 分析: f[i,j]表示第i行状态为j的方案总数. 状态转移方程f[i, ...

  8. 洛谷P3803 【模板】多项式乘法(FFT) 【fft】

    题目 这是一道FFT模板题 输入格式 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输出格式 第一行2个正整数n,m. 接下来一行n+1个数字,从低到高表示 ...

  9. 浅谈 easyui tabs 的href和content属性

    众所周知,jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上的内容:“href远程请求”和“content本地内容”,本文就两种方式的优缺点进行简单分析和思考. 两者特点: ...

  10. live-server 快速搭建静态服务

    作为切图仔呢,平时都是在修改页面样式.展示后台返回的数据.调试js效果,这时候呢就需要搭一个服务器以便我们调试.平时我一般用的都是wamp,在www目录下新建项目然后开始撸代码,不过有时候呢不太方便, ...