当前位置: 首页 > news >正文

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)算法。


对故障进行测试。通常都是成功的做法得到了充分的测试而失败的情况则被忽略了。系统可能在生产环境中运行了很长时间,都不会产生故障。可使用故障注入的方式来手动出发故障并模拟。这样一来,就能够测试系统的弹性。


拥抱混沌工程。混沌工程通过在生产实例中随机注入故障或异常情况来扩展故障注入的概念。

相关文章:

  • Nebula3 RTTI 小技巧
  • azure 最佳实践 -- 保持冗余
  • Swift 3 打印功能
  • 还需要编写DAO代码吗?SQL+接口就足够了!(Part 1)
  • 百度关闭竞价排名部分功能,以提升用户体验
  • linux 更新nodejs到最新
  • 移动MM初探之一:苹果APP Store模式将不再赢利?
  • 七大热门商业智能产品(非开源)
  • azure 最佳实践 3--最小协同操作
  • linux-2.6.26内核中ARM中断实现详解(2)
  • azure 最佳实践4 --可水平扩展的设计
  • 开发即过程!立此纪念一个IT新名词的诞生
  • azure 最佳实践5--使用分区
  • asp.net Webapi登录azureAD并调用azure graph api
  • (翻译)terry crowley: 写给程序员
  • 收藏网友的 源程序下载网
  • 2019年如何成为全栈工程师?
  • Android优雅地处理按钮重复点击
  • Angular数据绑定机制
  • axios 和 cookie 的那些事
  • ComponentOne 2017 V2版本正式发布
  • go语言学习初探(一)
  • HashMap剖析之内部结构
  • JAVA SE 6 GC调优笔记
  • Java 多线程编程之:notify 和 wait 用法
  • Median of Two Sorted Arrays
  • PaddlePaddle-GitHub的正确打开姿势
  • spring security oauth2 password授权模式
  • 动态魔术使用DBMS_SQL
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 三分钟教你同步 Visual Studio Code 设置
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 选择阿里云数据库HBase版十大理由
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (windows2012共享文件夹和防火墙设置
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (力扣题库)跳跃游戏II(c++)
  • (四)linux文件内容查看
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • ./configure,make,make install的作用(转)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 回调、接口回调、 委托
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET开发者必备的11款免费工具
  • [ C++ ] STL---string类的使用指南
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [C\C++]读入优化【技巧】