线上防雪崩利器——熔断器设计原理与实现

前言

这是一篇根据工作中遇到的问题总结出的最佳实践。

上周六,我负责的业务在凌晨00-04点的支付全部失败了。

结果一查,MD,晚上银行维护,下游支付系统没有挂维护公告,在此期间一直请求维护中的银行,当然所有返回就是失败了,有种欲哭无泪的感觉,锅让业务来背。

为了杜绝在此出现这种大面积批量的支付失败情况发生,保障系统的健壮性。我需要个在集中性异常的时候可以终止请求,当服务恢复,恢复请求。

我想了一些方式,最后,觉得熔断器比较适合干这种事情。

状态模式

我们已一个开关为例

在每一种状态下,context不必关心每一种状态下的行为。交给每一种状态自己处理。

熔断器基本原理

熔断器是当依赖的服务已经出现故障时,为了保证自身服务的正常运行不再访问依赖的服务,防止雪崩效应

熔断器本身就是一个状态机。

关闭状态:熔断器的初始化状态,该状态下允许请求通过。当失败超过阀值,转入打开状态,

打开状态:熔断状态,该状态下不允许请求通过,当进入该状态经过一段时间,进入半开状态。

半开状态:在半开状态期间,允许部分请求通过,在半开期间,观察失败状态是否超过阀值。如果没有超过进入关闭状态,如果超过了进入关闭状态。如此往复。

之前,查了一些资料,网上所有的资料几乎都是针对Hystrix的。这个只是针对分布式系统的接口请求,并不能运用于我们的系统中,因此这种情况下,根据原理自己实现了一个基本的分布式熔断器,数值与计数器存放在redis中,因为redis的操作客户端不一样,我就以本地熔断器为例,讲解熔断器实现。

希望我的文章能对于理解熔断器,以及需要熔断器的人有所帮助。

简单的本地熔断器实现

一个基本的本地熔断器。

image.png

对外暴露接口

熔断器对外暴露接口

熔断器状态对外暴露接口

三种状态

关闭状态实现:

打开状态

半开状态

熔断器

抽象熔断器

本地熔断器

测试例子

结果

原文地址:https://www.cnblogs.com/Javaba/p/9751322.html

时间: 2024-07-31 20:59:10

线上防雪崩利器——熔断器设计原理与实现的相关文章

线上应用调试利器 --Arthas

在之前的文章中,我介绍了使用 Btrace 工具进行线上代码的debug (https://www.cnblogs.com/yougewe/p/10180483.html),其大致原理就是通过字节码注入的方式进行辅助排查. 可以说,btrace 已经给我们的开发调试一带来了许多的方便,我们在上面做任何想要的调试!但是,明显, btrace 的使用还是有一定成本的,比如:安装应用,写调试脚本... 所以,今天我们再来看一大利器: arthas (阿尔萨斯) arthas 官网地址:https://

防雪崩利器:熔断器 Hystrix 的原理与使用

原地址:https://segmentfault.com/a/1190000005988895 前言 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级. 而Hystrix的出现,给我们提供了另一种选择. 服务雪崩效应的定义 服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程.如果所示: 上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务

防雪崩利器:熔断器 Hystrix 的原理与使用(转)

https://segmentfault.com/a/1190000005988895 前言 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级. 而Hystrix的出现,给我们提供了另一种选择. 服务雪崩效应的定义 服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程.如果所示: 上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者.

线上问题排查利器Arthas

官方文档 下载arthas-boot.jar,然后用java -jar的方式启动: curl -O https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar 执行该程序的用户需要和目标进程具有相同的权限.比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -u admin -EH java -jar arthas-boot.

听说”双11”是这么解决线上bug的

--Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同小异.这里仅仅针对眼下最火的框架AndFix进行解说.主要从AndFix的使用.原理以及优缺点三个方面进行阐述. 使用方式 介绍 AndFix是一个AndroidApp的在线热补丁框架. 使用此框架,我们可以在不反复发版的情况下,在线改动App中的Bug.AndFix就是 "AndroidHot-Fix"的缩写. 就眼下来说,AndFix支持An

Redis架构之防雪崩设计:网站不宕机背后的兵法

Redis架构之防雪崩设计:网站不宕机背后的兵法 原创: 付磊,张益军 高可用架构 2017-03-24 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防及优化 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如图 11-3 所示整个过程分为如下 3 步: 缓存层不命中 存储层不命中,所以不将空结果写回缓存 返

线上界面和设计原稿

线上界面和设计原稿的巨大差异 在互联网产品的研发流程中,页面的视觉还原是很重要的一个步骤,也往往是问题最多的一个环节.如果一些细节问题在这个环节没有被有效地发现并解决,那么后续流程中再去解决这些问题的成本就会呈指数上升. 那么今天我们就来梳理一下,看看前端工程师本身以及上下游的角色之间,都会容易遇到哪些常见的问题. 设计师 设计师是最贴近产品体验的人,但是术业有专攻,设计师往往更加注重视觉的表现,而容易犯一些美丽的错误: 1,以原生 APP 的体验类比 H5 页面设计 我们都知道,原生 APP

Android ListView下拉/上拉刷新:设计原理与实现

 <Android ListView下拉/上拉刷新:设计原理与实现> Android上ListView的第三方开源的下拉刷新框架很多,应用场景很多很普遍,几乎成为现在APP的通用设计典范,甚至谷歌官方都索性在Android SDK层面支持下拉刷新,我之前写了一篇文章<Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新>专门介绍过(链接地址:http://blog.csdn.net/zhangphil/article/details/4696537

移动端界面中的版式设计原理(上)

移动端界面中的版式设计原理(上) --安阳师范学院互联网+应用技术学院UI设计方向讲师 黄艳芳设计本身就是一门理性的学科,审美因人而异,只有言之有理的设计才能够说服别人.当设计师拿到产品的原型开始做设计时,如果只是单纯的按照原型进行而不考虑任何规则,那么很多时候就会产生一些不协调的结果.设计完之后产品不满意,自己也不满意.在UI设计中其实也存在大量的版式设计原理,如果产品和设计都能对版式设计有一定的了解,那么设计师拿到原型的时候,评审设计输出稿的时候大家都能更好地理解对方的设计.以下我总结了几种