造成雪崩的真实场景

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 就不在这篇讲了,后续奉上~

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料都是免费分享的,有需要学习的小伙伴可以直接点点点点点这里免费下载

解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料都是免费分享的,有需要学习的小伙伴可以直接点点点点点这里免费下载**

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

【原理+实战+视频+源码】java更新无法下载所需安装文件相关推荐

  1. 自学者福利!知乎上已获千赞,原理+实战+视频+源码

    前言 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开 ...

  2. 金三银四Android面试的一些感受,原理+实战+视频+源码

    一.前言 刚拿到字节offer,经历了5次面试,其中4轮技术面,1轮HR面试.在这里分享一下自己的面试经验和学习心得.希望能够帮助更多的小伙伴. 我本科毕业于四川师范学院计算机系,刚毕业时也是小白,也 ...

  3. 学海无涯!算法题+JVM+自定义View,原理+实战+视频+源码

    阿里面试 自我介绍 首先要介绍自己的项目经验和个人的擅长点,因为面试官主要考察你的表达能力和语言精简能力. 简历的编写其实这里可能需要注意几点: 1.标题的直接按照姓名-几年工作经验-应聘岗位格式来填 ...

  4. 【原理+实战+视频+源码】docker权限参数

    一面: 个人介绍加项目介绍20分钟 微服务架构是什么,它的优缺点? ACID CAP BASE理论 分布式一致性协议,二段.三段.TCC,优缺点 RPC过程 服务注册中心宕机了怎么办? 微服务还有其他 ...

  5. 腾讯3轮面试都问了Android事件分发,原理+实战+视频+源码

    一.架构师专题 想要掌握复杂的技术,必须要理解其原理和架构.本模块结合实际一线互联网大型项目理解架构思维,抽丝剥茧,层层深入,帮助大家成为Android架构师,在思想上对架构认识有一次升华,并知其所以 ...

  6. 年末阿里百度等大厂技术面试题汇总,原理+实战+视频+源码

    前言: Android 应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的形势来看,Android开发相当火热,但是高级Android开发人才却比较少,现在移动互联网的开发者也逐步开始关注插 ...

  7. Android动态换肤实现原理解析,原理+实战+视频+源码

    前言 本人今年25岁,毕业之后进入一家小型的互联网公司工作,在这原公司呆了3年,直至今年才有了跳槽的想法. 每个程序员 都拥有大厂梦,我也不例外,在小公司待久了,感觉人会荒废掉,太轻松,没有压迫感.因 ...

  8. 大佬手把手教你如何仿写出大厂的APP,原理+实战+视频+源码

    除了Bug,最让你头疼的问题是什么?单身?秃头?996?面试造火箭,工作拧螺丝? 作为安卓开发者,除了Bug,经常会碰到下面这些问题: 应用卡顿,丢帧,屏幕画面撕裂,操作界面刷新缓慢,UI不美观,布局 ...

  9. 【原理+实战+视频+源码】docker映射端口教程

    阿里巴巴Java岗面试题分享 1.HashMap 的内部结构?内部原理?和 HashTable 的区别,假如发⽣了 hash 碰撞,如何设计能让遍历效率⾼? 2.讲一讲讲讲 ConcurrentHas ...

最新文章

  1. C8-1 复数加减乘除 (100/100 分数)
  2. 图文并茂,傻瓜都能看懂的 JVM 内存布局
  3. linux java jar war_简单介绍Java 的JAR包、EAR包、WAR包区别
  4. kali创建python脚本_kali下编译学习python3
  5. Layui表单账号注册校验密码是否一致
  6. Atitit xml转json总结 目录 1.1. XML和JSON之间没有直接映射;元素类型问题 1 1.2. Xml与json的对应关系 2 1.3. 范例 2 2. Jsonlib的问题,,不
  7. Power Query M语言全部Text函数(字符串函数)分类,快速掌握
  8. 【MATLAB】图像分割
  9. echarts最简单的南丁格尔玫瑰图+图例
  10. 服务器桌面假死怎么处理,只需一分钟轻松搞定Win7桌面假死问题
  11. Day16_IO框架1(File类, IO流, 字节流字符流, IO异常, Properties)
  12. java模拟器下载_JAVA模拟器(指小游)
  13. java计算机毕业设计交通规则考试系统源码+mysql数据库+系统+lw文档+部署
  14. reactos回顾总结(一)reactos源码编译
  15. 新版本读取老版本文件崩溃BUG
  16. ipc4 - A 转换AV号(avtobv)
  17. 关于安全防御方面的总结
  18. http 411错误
  19. 使用阿里云DNS实现自己的DDNS服务
  20. GD32 CANFD仲裁区500K,数据区2M 测试

热门文章

  1. pybind传输list
  2. retinaface人脸对齐
  3. windows10用c++部署libtorch过程中遇到的一些问题
  4. non-strictly-monotonic PTS
  5. the cdb terminated,Qt调试器问题
  6. Android Studio Gradle优化方法
  7. 鸭鸭邀请------青龙毛毛
  8. it 脑裂_脑裂是什么?Zookeeper是如何解决的?
  9. print arraylist 显示的不是内容_泛型数组列表 java.util.ArrayListlt;Egt;
  10. centos7 shell脚本自动优化yum firewalld xelinux