常用失败控制模式

本文内容主要翻译自Reactive Systems Architecture第一章1.9节。

在分布式系统中,有组件发生故障造成对应服务失败是很平常的一件事。这里简单阐述一下在发生这些错误时的一些常用处理模式。

失败控制(failure control)的一个目标是在系统或他的一部分失败的情况下如何实现期望的一致性和传递保证。在部分系统失败的情况下,不影响到系统其他部分的稳定性。

但通常工程师不会意识到失败是很自然的一件事。

  • 只是记录异常log 如果log不被人处理就一直保持失败
  • 一个服务持续的失败可能导致来自于其他服务的过度重试,导致该服务被压垮,也可能造成依赖他的服务的级联失败。
  • 每个服务都有性能限制,过度访问会造成服务失败(DoS).

下面简单介绍一下一些失败处理的方式

隔离和挡板(Isolation and bulkheading)

隔离失败 让失败不影响到其他系统

系统组件不要过度耦合

Hystrix

背压Backpressure

生产者根据消费者的消费步调来调整自己的生产速度

一般采用消费者(服务器)去获取内容(队列里面拿请求) 而不是生产者(客户端)去推送到消费者(服务器)

Akka Streams

Apache Spark Streaming

简单点的做法是用限流(RateLimiter)的方式 丢弃多余的请求

监督者(Supervision)

模块都会有一个监督者

组件挂了对应的监督者会收到通知 监督者会应用指定的策略去处理失败

Akka

断路器(Circuit breaker)

  • 关闭状态:调用失败或超时会让失败计数增加 成功的调用置零计数器 当达到最大的失败次数时 断路器切换为打开状态
  • 打开状态:所有调用立即返回失败(断路) 避免给挂了的服务增加额外压力,造成联机(比如大量调用超时 浪费客户端资源)失败。在经过配置时间之后 切换为半开状态
  • 半开状态:放开一个调用查看是否成功 成功了切换至关闭状态。

部分执行(Partial execution)

调用几个方法完成指定工作,其中有几个调用失败的情况。

有以下的一些处理方式:

事务保证: Atomic Broadcast 2PC

日志保证:journalling或write ahead log

事务补偿

服务降级(Service level degradation control)

系统出错时大多数工程师会返回错误,这常常会导致服务的不可用。

通过提供部分的服务可用可以降低服务直接不可用的开销。

fallback策略

参考链接:

https://www.cnblogs.com/iceTing/p/6238207.html

https://www.safaribooksonline.com/library/view/reactive-systems-architecture/9781491980705/

原文地址:https://www.cnblogs.com/fairjm/p/failure_control_patterns.html

时间: 2024-10-05 05:50:42

常用失败控制模式的相关文章

linux pam 控制模式

工作类别(type).流程栈(stack)和控制模式(control) Linux-PAM 工作的"类别"(type) PAM 的具体工作主要有以下四种类别(type):account,auth,password 以及 session.这里,我们用非定义化的语言来简单解释一下这四种类别. account:在用户能不能使用某服务上具有发言权,但不负责身份认证.比如,account 这个 type 可以检查用户能不能在一天的某个时间段登录系统.这个用户有没有过期.以及当前的登录用户数是否已

架构_10 个常用的软件架构模式

你是否曾经思考过如何设计大型的企业级系统?在决定启动软件开发之前,首要的是选择恰当的架构来指引系统的功能及质量属性设计.因此在将软件架构应用于设计之前,必需要了解常用的架构模式. 什么是架构模式? Wikipedia 的解释: 在软件架构中,架构模式是对特定环境下常见问题的通用且可重用的解决方案.架构模式与软件设计模式很相似,但架构模式的层次更高,且外延更大. 这篇文章将简述常见的 10 种架构模式的概念.用法以及其优缺点. 分层模式(Layered pattern) 客户端/服务器模式(Cli

php 常用五种模式

/* 设计模式之单例模式 $_instance 必须声明为静态的私有变量 构造函数必须声明为私有,防止外部程序 new 类从而失去单例模式的意义 getInstance() 方法必须设置为公有的,必须调用此方法以返回实例的一个引用 :: 操作符只能访问静态变量和函数 new 对象会消耗内存 使用场景:最常用的地方是数据库连接 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用 [单例模式适用场景] 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 2.当这个唯一实例应该是

HTML的<body>标签详解与HTML常用的控制标记

一.<body>标签: 用于标记网页的主体,body 元素包含文档的所有内容(比如文本.超链接.图像.表格和列表等等.) 1.body标签中可用的属性: bgcolor="颜色值":设置整个网页的背景颜色 text="颜色值":设置文字的颜色色 link="颜色值":设置一般超链接文本的显示颜色 vlink="颜色值":设置访问过的超链接文本显示的颜色 alink="颜色值":设置鼠标移动到超链

C语言各种存储模式的区别?最常用的存储模式有哪些?

DOS用一种段地址结构来编址计算机的内存,每一个物理内存位置都有一个可通过段地址一偏移量的方式来访问的相关地址.为了支持这种段地址结构,大多数C编译程序都允许你用以下6种存储模式来创建程序: -----------------------------------------------------------------------   存储模式              限制                    所用指针 -----------------------------------

IOS常用设计模式——委托模式(IOS开发)

委托模式在之前的博客中用到了很多,比如各种复杂的Cocoa Touch框架的UI控件,几乎都用到了委托来响应控件事件或控制其他对象. 委托模式 -问题: 处理一切IOS应用都在UIApplication中完成,但是在设计过程中并不友好,它藕合度高,职责不清,难以维护,需要不断不断的重构,因此需要把看似功能很复杂的类分解或者分派成功能明确的类. Apple中我们经常用两种类,一个是框架类,各种用,不断的用,啥都能用:另一个就是协议类,就是协议. 协议的目的,终究是降低一个对象的复杂度和藕合度.框架

太阳能控制器常见的控制模式!

太阳能控制器主要是控制光伏板给蓄电池充电的,还有电压灵敏设备提供负载控制电压的装置.它对蓄电池的充.放电条件加以规定和控制,并按照负载的电源需求控制太阳电池组件和蓄电池对负载的全部电能输出,同时也是整个光伏供电系统是最核心的控制部分. 1.纯光控模式:就是当没有太阳光时,光强降至启动点,控制器延时10分钟确认启动信号后,然后会根据设置的参数开通负载,负载开始进行工作:当有阳光的时候,光强升到启动点,控制器延时10分钟确认关闭信号后会进行自动关闭输出,负载开始停止工作. 2.光控加时控模式:在启动

IOS常用设计模式——MVC模式(IOS开发)

Cocoa Touch中的MVC模式中,模型和视图不能进行通信,所有通信都是控制器完成. - 模型:是个较为特殊的对象,本质是视图的数据,Text Field输入的内容,Button上的标签都是模型,不一定非要创建一个模型类. - 视图:UIView,这个比较容易理解,向控制器发送请求. - 控制器:更新视图作为对用户请求的回应,更新模型的数据. 模型里面就是数据,视图就是个界面,控制器是中间的更新媒介. 1.触摸myButton时候,会触发方法. 2.视图控制器实现了一些委托和数据源的协议.

软件开发常用设计模式—门面模式总结

facade 门面模式定义:有的人也叫它外观模式 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用. 模式说明: 子系统(SubSystem):负责处理复杂的逻辑处理.不直接跟客户打交道.门面(Facade):负责跟子系统进行交互,提供简单易用的功能或接口给客户.客户(Client):通过门面和子系统进行交互,不需关心子系统的细节. 主要作用: 简化复杂接口, 解耦和来屏蔽客户端对子系统的直接访问 c++实现代码(网上大牛提供) 1 #incl