硬件故障:
如网络故障、硬盘损坏等。面试
程序的 bug:
如算法须要占用大量 CPU 的计算时间致使 CPU 使用率太高。算法
缓存击穿:
好比应用刚重启,短期内缓存是失效的,致使大量请求直接访问到了数据库,数据库不堪重负,服务不可用。数据库
秒杀和大促:
服务短期承载不了那么多请求量。用户连续重试:
好比用户看到界面上没有响应,因此又操做了一遍,结果又增长了一倍请求量。缓存
程序重试机制:
好比代码中有屡次重试的逻辑,一次失败后,过几秒后再重试,重试个三次就取消重试,走异常处理分支了。也是增长了请求量。出问题前预防:限流、主动降级、隔离markdown
出问题后修复:熔断、被动降级网络
「本篇主要来说解熔断机制。」?后续几篇会讲解其余方案。ide
熔断这个概念来源于电路系统中的保险丝
熔断。当电流过大时,保险丝熔断,防止因电流过大
损坏电器元器件,或因电流过大,致使元器件热度太高,发生火灾。线程
「物理公式」?电功率 P = I^2 * R,I 表明电流,元器件的电阻 R 不变的状况下,电流越大,电功率约大,电阻作的电功大部分都用来发热
了,因此电功率越大,发热越严重。(还好高中物理没忘。)3d
放到咱们系统中,怎么理解熔断?code
若是在某段时间内,调用某个服务很是慢甚至超时,就能够将这个服务熔断,后续其余服务再调用这个服务就直接返回,告诉其余服务:「“已经熔断了,你别调用我了,过段时间再来试下吧。”」
「熔断有个原则」?一段时间内,统计失败的次数或者失败请求的占比超过必定阈值,就进行熔断。
详细的原理以下图所示:
请求访问到后台服务后,首先判断熔断开关是否打开。
若是熔断开关已打开
,则代表当前请求不能被处理。
若是熔断开关未打开
,则判断时间窗口是否已满。
若是时间窗口未满
,则请求桶中的请求数加 1。
若是返回的响应有异常,则失败桶的失败数加 1
,若是返回的响应没有异常,则成功桶的成功数加 1
。
已满
,则开始判断是否须要熔断。当熔断后,开关切换到断开状态
。
过一段时间后,开关切换为半断开状态
(Half-Open)。半断开状态下,容许对应用程序的必定数量的请求能够去调用服务,若是调用成功,则认为服务能够正常访问了,因而将开关切换为闭合状态
。
断开状态
。时间窗口能够比喻为人坐在窗户边,看外面来往的车辆,必定时间内从窗户外通过的车辆。
每次请求,都会判断时间窗口是否已满(如5分钟),若是时间窗口已满,则从新开始计时,且清理请求数/成功数/失败数。
开关为断开的状态,通过必定时间后,好比 1 分钟,设置为半断开
的状态,尝试发送请求检测服务是否恢复。
若是已恢复,则切换状态为关闭状态。若是未恢复,则切换状态为断开
的状态,通过 1 分钟后,重复上面的步骤。
确定有人会问了,你这上面讲的原理,难道还真的本身去写这套算法?
「答案:是的,项目中咱们本身造了一个轮子:熔断器。」
但这里我不推荐你们这么作。市面上还有更优秀的开源组件供你们使用,好比阿里系的?Sentinel
(推荐),Netflix 的?Hystrix
(已中止更新)。
固然 Sentinel 就不在这篇讲了,后续奉上~
### 最后
通过日积月累, 如下是小编概括整理的深刻了解Java虚拟机文档,但愿能够帮助你们过关斩将顺利经过面试。
因为整个文档比较全面,内容比较多,篇幅不容许,下面以截图方式展现 。若有须要获取资料文档的朋友,[能够点击这里免费获取]( )
因为篇幅限制,文档的详解资料太全面,细节内容太多,因此只把部分知识点截图出来粗略的介绍,每一个小节点里面都有更细化的内容!