手把手教你写!黑马培训java需要多长时间
造成雪崩的真实场景
1.4.1 服务提供者不可用
硬件故障:
如网络故障、硬盘损坏等。程序的 bug:
如算法需要占用大量 CPU 的计算时间导致 CPU 使用率过高。缓存击穿:
比如应用刚重启,短时间内缓存是失效的,导致大量请求直接访问到了数据库,数据库不堪重负,服务不可用。秒杀和大促:
服务短时间承载不了那么多请求量。
1.4.2 重试加大流量
用户连续重试:
比如用户看到界面上没有响应,所以又操作了一遍,结果又增加了一倍请求量。程序重试机制:
比如代码中有多次重试的逻辑,一次失败后,过几秒后再重试,重试个三次就取消重试,走异常处理分支了。也是增加了请求量。
五、如何防止雪崩
方案
出问题前预防:限流、主动降级、隔离
出问题后修复:熔断、被动降级
「本篇主要来讲解熔断机制。」 后续几篇会讲解其他方案。
六、熔断原理和算法
1.6.1 熔断概念
熔断这个概念来源于电路系统中的保险丝
熔断。当电流过大时,保险丝熔断,防止因电流过大
损坏电器元器件,或因电流过大,导致元器件热度过高,发生火灾。
「物理公式」 电功率 P = I^2 * R,I 代表电流,元器件的电阻 R 不变的情况下,电流越大,电功率约大,电阻做的电功大部分都用来发热
了,所以电功率越大,发热越严重。(还好高中物理没忘。)
放到我们系统中,怎么理解熔断?
如果在某段时间内,调用某个服务非常慢甚至超时,就可以将这个服务熔断,后续其他服务再调用这个服务就直接返回,告诉其他服务:「“已经熔断了,你别调用我了,过段时间再来试下吧。”」
1.6.2 如何熔断
「熔断有个原则」 一段时间内,统计失败的次数或者失败请求的占比超过一定阈值,就进行熔断。
详细的原理如下图所示:
1.6.3 统计请求的算法
请求访问到后台服务后,首先判断熔断开关是否打开。
如果熔断开关
已打开
,则表明当前请求不能被处理。如果熔断开关
未打开
,则判断时间窗口是否已满。如果时间窗口
未满
,则请求桶中的请求数加 1。如果返回的响应有异常,则失败桶的
失败数加 1
,如果返回的响应没有异常,则成功桶的成功数加 1
。如果时间窗口
已满
,则开始判断是否需要熔断。
1.6.4 熔断的恢复算法
当熔断后,开关切换到
断开状态
。过一段时间后,开关切换为
半断开状态
(Half-Open)。半断开状态下,允许对应用程序的一定数量的请求可以去调用服务,如果调用成功,则认为服务可以正常访问了,于是将开关切换为闭合状态
。如果半断开状态下,还是有调用失败的情况,则认为服务还没有恢复,开关从半断开状态切换到
断开状态
。
1.6.5 统计失败率的时间窗口
时间窗口可以比喻为人坐在窗户边,看外面来往的车辆,一定时间内从窗户外经过的车辆。
每次请求,都会判断时间窗口是否已满(如5分钟),如果时间窗口已满,则重新开始计时,且清理请求数/成功数/失败数。
注意:第一次开始的起始时间默认为当前时间。
1.6.6 尝试恢复服务的时间窗口
开关为断开的状态,经过一定时间后,比如 1 分钟,设置为
半断开
的状态,尝试发送请求检测服务是否恢复。如果已恢复,则切换状态为关闭状态。如果未恢复,则切换状态为
断开
的状态,经过 1 分钟后,重复上面的步骤。这里的时间窗口可以根据环境的运行状态进行动态调整,比如第一次是 1 分钟,第二次是 3 分钟,第三次是 10 分钟。
七、熔断中间件
肯定有人会问了,你这上面讲的原理,难道还真的自己去写这套算法?
「答案:是的,项目中我们自己造了一个轮子:熔断器。」
但这里我不推荐大家这么做。市面上还有更优秀的开源组件供大家使用,比如阿里系的 Sentinel
(推荐),Netflix 的 Hystrix
(已停止更新)。
当然 Sentinel 就不在这篇讲了,后续奉上~
最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
资料领取方式:点击这里免费获取
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
ttps://gitee.com/vip204888/java-p7)**
[外链图片转存中…(img-joq9CFBa-1626942751970)]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
手把手教你写!黑马培训java需要多长时间相关推荐
- 手把手教你写一个spring IOC容器
本文分享自华为云社区<手把手教你写一个spring IOC容器>,原文作者:技术火炬手. spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功 ...
- socket 长链接linux,手把手教你写 Socket 长连接
原标题:手把手教你写 Socket 长连接 8点43分打卡 就是真爱 本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号玉刚说所有,未 ...
- 手把手教你写需求之代码实现pdf转jpg
前言 初入公司,很多朋友如果碰到一些莫名其妙的需求,没有做过就会很慌张.不要慌张,本文通过一个小案例手把手教你写需求. 场景 一个阳光明媚的下午,需求小姐姐向你款款走来,娇滴滴的寻求你帮忙,她需要你把 ...
- Android 开发之手把手教你写 ButterKnife 框架(三)
系列文章目录导读: Android开发之手把手教你写ButterKnife框架(一) Android开发之手把手教你写ButterKnife框架(二) Android开发之手把手教你写ButterKn ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
转自即时通讯网:http://www.52im.net/ 本文原作者:"水晶虾饺",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说" ...
- 手把手教你写一个中文聊天机器人
本文来自作者 赵英俊(Enjoy) 在 GitChat 上分享 「手把手教你写一个中文聊天机器人」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 发布这篇 Chat 的初衷是想和 ...
- 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫
系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...
- 手把手教你写一个生成对抗网络
成对抗网络代码全解析, 详细代码解析(TensorFlow, numpy, matplotlib, scipy) 那么,什么是 GANs? 用 Ian Goodfellow 自己的话来说: " ...
- php注册程序,[PHP初级]手把手教你写注册程序 1
[PHP初级]手把手教你写注册程序 1 实例内容 在此教程,我们将通过写一个用户注册程序,学习以下内容: 数据的传输与获取 信息的验证 pdo方式操作数据库 事务处理 前台显示文件:index.php ...
最新文章
- 【spring】第二个springmvc helloworld 以及 spring模糊路径
- webpack4 系列教程: 前言
- .net中如何生成不重复的随机数
- (php)实现万年历
- Yii2 behavior运用
- lisp坐标一键生成_Grasshopper自动生成坡度标注
- C#基于websocket-sharp实现简易httpserver(封装)
- 3.1EDA和数据描述: 探索性数据分析
- Django学习手册 - csrf
- 【Xamarin挖墙脚系列:卸载不彻底的解决】
- Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
- Qt_qDebug 原理详解
- python设计模式
- 知识竞赛抢答器PLC设计
- 饼图-图例标记及文字的设置
- android手机屏分辨率和屏幕逻辑,手机屏幕分辨率术语:逻辑分辨率和物理分辨率...
- PTA:复数求模的类模板
- 在GNU/Linux下将CD音乐转为mp3
- windows 组播收不到消息_只需2步,轻松解决登录微信电脑版后,手机收不到消息提醒的问题...
- 发布:世界上第一个小米平板4上的Debian Linux 刷机包