azure最佳实践系列1-自我修复的设计
如何设计你的应用,能够在系统错误时做到自我修复?
在分布式系统中,会经常遇到错误。硬件也会遇到异常情况。网络有时会出现短暂的错误。整个地区出现了服务中断。即便如此,关于这些问题的方案也是要提前规划的。
因此,需要设计一个能够在错误出现时完成自我修复的系统,主要包括以下3个部分:
发现错误。
正确的对待错误。
使用日志并监控错误,提高可操控性。
对故障类型的响应取决于应用的可用性的需求。例如,如果你需要系统是高可用的,你可能会希望在故障发生时,系统自动切换到辅助区域。然而,这种部署比单一区域的价格高的多。
而且,不要只考虑像区域切换这样的大事件,事实上很少见。你需要将重点放在如何处理本地的短期故障,例如网络链接错误或数据库连接错误。
推荐做法
Retry failed operations. Transient failures may occur due to momentary loss of network connectivity, a dropped database connection, or a timeout when a service is busy. Build retry logic into your application to handle transient failures. For many Azure services, the client SDK implements automatic retries. For more information, see Transient fault handling and Retry Pattern.
对失败操作进行重试。网络链接错误,数据库连接错误或服务调用的超时都会造成短暂的系统错误。在很多zure服务中,客户端的SDK都实现了自动重试模式。有关更多信息,可参见Transient fault handling(https://docs.microsoft.com/en-us/azure/architecture/best-practices/transient-faults)和Retry Pattern(https://docs.microsoft.com/en-us/azure/architecture/patterns/retry)
保护远程服务(断路器)。当出错时,进行重试是对的。不过如果错误始终存在,最终就会囤积太多对失败服务的请求。这可能会引起级联错误。在操作被判断可能会失败时,使用断路器模式(https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker)来加速失败(不进行远程调用)。
隔离关键资源(挡板)。在子系统中的错误有时会有级联。当错误引起一些资源,例如线程或socket没有及时释放,会造成资源衰竭。为了避免这种情况,需要把系统隔离到不同的分组中,这样一来,一个分组中内部的错误就不会影响到整个系统。
负载均衡。应用可能会遇到突然的流量高峰,导致后端服务被压垮。为了避免这种情况,可以使用基于队列的负载均衡模式(https://docs.microsoft.com/en-us/azure/architecture/patterns/queue-based-load-leveling),对请求进行排队,依次执行。队列扮演了缓存的角色,平缓了负载高峰。
故障转移。如果一个实例不可达,转移(请求)到另一个实例。对于无状态的对象来说,例如web服务器,可以放多个实例在负载均衡器或traffic manager的背后。对于有状态的对象来说,例如数据库,可以使用副本(同步状态)再故障转义。应用需要根据不同的数据复制方式来处理最终的一致性问题。
补偿失败的事务。一般来说,要避免分布式事务,因为它们需要在服务间和资源进行协调。比较倾向于小的独立事务组成一种操作。如果操作失败,需要使用补偿事务模式(https://docs.microsoft.com/en-us/azure/architecture/patterns/compensating-transaction)来撤销已经完成的步骤。
检查长时间运行的事务。检查点在为长时间运行的事务失败时提供弹性。当操作重启时(例如VM),可以从上一次的检查点的位置继续上次操作。
优先级。有时你可能无法短时间解决一个问题。不过你可以提供核心功能。例如,一个显示书籍目录的应用。如果应用无法获取封面的缩略图,则可能会显示占位符的图像。再如,一个电商网站,显示产品建议没有订单的处理重要。
请求节流。有时一小部分客户端会在系统中产生大量负载,降低了应用程序的整体可用性。在这种情况下,可以对这部分客户端进行节流。参见节流模式(https://docs.microsoft.com/en-us/azure/architecture/patterns/throttling)。
阻止恶意的客户端。对客户端节流不等于这个客户端是恶意的。只是因为这个客户端超出了服务器的流量限制。但是如果一个客户端持续的对系统产生高负载,或者其他对系统不利的行为。你就需要对这个客户端的连接进行阻止。需要定义取消阻止的处理方式,用户可以申请取消阻止。
使用选举领导模式(https://docs.microsoft.com/en-us/azure/architecture/patterns/leader-election)。当进行任务协调时,可使用领导选举模式来选出一个协调器。这样一来,协调器就不是单一的失败节点。当协调器失败时,新节点就被选出了。不需要从头开始写领导者选举算法,可以考虑使用现有的zookeeper(https://en.wikipedia.org/wiki/Apache_ZooKeeper)算法。
对故障进行测试。通常都是成功的做法得到了充分的测试而失败的情况则被忽略了。系统可能在生产环境中运行了很长时间,都不会产生故障。可使用故障注入的方式来手动出发故障并模拟。这样一来,就能够测试系统的弹性。
拥抱混沌工程。混沌工程通过在生产实例中随机注入故障或异常情况来扩展故障注入的概念。
azure最佳实践系列1-自我修复的设计的更多相关文章
- nodejs 实践:express 最佳实践系列
nodejs 实践:express 最佳实践系列 nodejs 实践:express 最佳实践(一) 项目结构 nodejs 实践:express 最佳实践(二) 中间件 nodejs 实践:expr ...
- 基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一
[摘要]仓储管理存在四大细分场景:出入库管理.盘点.分拣和货物跟踪.本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践. 仓储 ...
- Istio最佳实践系列:如何实现方法级调用跟踪?
赵化冰,腾讯云高级工程师,Istio Member,ServiceMesher 管理委员,Istio 项目贡献者,热衷于开源.网络和云计算.目前主要从事服务网格的开源和研发工作. 引言 TCM(Ten ...
- iOS应用开发最佳实践系列一:编写高质量的Objective-C代码
本文由海水的味道编译整理,转载请注明译者和出处,请勿用于商业用途! 点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法. 良好的 ...
- 【WEB前端开发最佳实践系列】CSS篇
一.有效组织CSS代码 规划组织CSS代码:组织CSS代码文件,所有的CSS都可以分为2类,通用类和业务类.代码的组织应该把通用类和业务类的代码放在不同的目录中. 模块内部的另一样式规则:样式声明的顺 ...
- 【Web前端开发最佳实践系列】前端代码推荐和建议
一.常用的前端文件的组织结构: 1.js (放置JavaScript代码) lib(放置框架JavaScript文件) custom.js 2.css(放置CSS样式代码) lib(放置框架CSS文件 ...
- Web前端开发最佳实践系列文章汇总
Web前端开发最佳实践(1):前端开发概述 Web前端开发最佳实践(2):前端代码重构 Web前端开发最佳实践(3):前端代码和资源的压缩与合并 Web前端开发最佳实践(4):在页面中添加必要的met ...
- azure 最佳实践 -- 保持冗余
保持冗余确保你的应用的部署体系是有冗余的,以避免单一节点失败的情况.一个弹性良好的系统可以灵活的绕过系统故障.找出应用中(请求执行)的关键路径.路径中的每个节点是否都有冗余?子系统失败时,系统能否有效 ...
- 【WEB前端开发最佳实践系列】JavaScript篇
一.养成良好的编码习惯,提高可维护性 1.避免定义全局变量和函数,解决全局变量而导致的代码“污染”最简单的额方法就是把变量和方法封装在一个变量对象上,使其变成对象的属性: var myCurrentA ...
随机推荐
- C/C++中RAND_MAX的用法
RAND_MAX是C中stdlib.h中宏定义的一个字符常量: #define RAND_MAX Ox7FFF 其值最小为32767,最大为2147483647 通常在产生随机小数时可以使用RAND_ ...
- MySQL—记录的增删改查操作
1.插入记录: 方法一:INSERT [INTO] tbl_name [(col_name,···)] {VALUES|VALUE} ({expr |DEFAULT},···),(···),··· 例 ...
- CORE MVC 自定义认证
微软的认证体系,集成了EF,和它的表结构,对于我们已有的系统,或者想高度自定义的人,该怎么办呢? 答案在: https://docs.microsoft.com/en-us/aspnet/core/s ...
- Android Studio开发学习 - 1. 添加Activity
1. 项目上点右键,New -> Activity -> Blank Activity 这将生成Activity的 Layout.Class .和相关的配置信息(在AndroidManif ...
- 防止XSS攻击的方式
主要有三种请求方式,进行过滤替换非法符号 1.普通的GET请求数据: 2.FORM表单提交数据: 3.Json格式数据提交: 把下面5个文件放入项目中即可 package com.joppay.adm ...
- PLMN和PSTN
一.PLMNPLMN公众陆地移动电话网(PLMN) public land mobile network 由政府或它所批准的经营者,为公众提供陆地移动通信业务目的而建立和经营的网路.该网路必须与公众交 ...
- 源码编译php
安装相关依赖: yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freet ...
- java程序结构
if....else.... 1. if都需要接判断表达式 2. else不需要表达式 3. 有if没else可以,但else必须要有一个if,if数>=else数 if (A条件) ...
- 【转】Python 字符串大小写转换
转载自:python 中字符串大小写转换 一.pyhton字符串的大小写转换, 常用的有以下几种方法: 1.对字符串中所有字符(仅对字母有效)的大小写转换,有两个方法: print 'just to ...
- 【Linux】结合Python 简易实现监控公司网站,邮件发送异常
背景 由于一些原因,博主负责测试的网站的服务器切换到了香港,切换后出现了多次访问超时的情况 于是主动请缨写一个自动监测的脚本,本来准备完全使用shell来写,后来发现shell发送邮件只能在测试机之间 ...