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 ...
随机推荐
- MySQL优化具体
1. 查询与索引优化分析 在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有慢查询日志,profiling分析,EXPLAIN分析查询,以及show命令查询系统状态及系统变量,通过定位分析 ...
- keras安装配置指南【linux环境】【转】
本文转载自:https://keras-cn.readthedocs.io/en/latest/for_beginners/keras_linux/#kerasmnist 本教程不得用于任何形式的商业 ...
- 对linux内核创建flash上的各分区源码进行分析
1.注意:内核源码版本为4.9 2.首先注意关键字符串"partitions found on MTD device 这句话在drivers/mtd/mtdpart.c的parse_mtd_ ...
- 永久更改hostname主机名
vim /etc/sysconfig/network NETWORKING=yesHOSTNAME=keepalived-nginx1GATEWAY=192.168.33.2 vim /etc/hos ...
- jsp中获取list长度
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ tag ...
- 爬虫之Xpath案例
案例:使用XPath的爬虫 现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地. # tieba_xpath.py #!/usr/ ...
- LeetCode——Increasing Triplet Subsequence
Question Given an unsorted array return whether an increasing subsequence of length 3 exists or not ...
- 自学Jav测试代码三 Math类 & Date & GregorianCalendar类
2017-08-23 20:30:08 writer: pprp package test; import java.util.Date; import java.util.*; public cla ...
- LightOJ 1356 Prime Independence(质因数分解+最大独立集+Hopcroft-Carp)
http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1356 题意: 给出n个数,问最多能选几个数,使得该集合中的 ...
- 数据可视化——matplotlib(2)
导入相关模块 import matplotlib.pyplot as plt import numpy as np import pandas as pd 图表设置 添加X.Y轴标签以及图标标题 a ...