购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3.1 面向失败编程

在一个使用大量服务器横向扩展的系统中,因某一台或某几台服务器故障而影响系统的高可用就变成了常态。假设一个业务使用了一万台服务器,即使每天每台服务器的故障概率只有万分之一,那么集群中每天依然会有服务器发生故障。

为了保障系统的高可用,就必须在系统设计、开发和部署的全过程中,时刻考虑在服务异常、服务器故障的场景下,如何确保故障不影响整体系统的可用性。

面向失败编程是软件设计和开发的一种理念,其核心思想在于假设系统的组件、服务或依赖的服务和组件一定会发生故障,并在设计和开发中考虑这些故障,以确保系统在发生故障后能够保持稳定运行或快速恢复。

面向失败编程的实现方式有很多,在系统设计时可以考虑使用多种系统容错手段来避免局部的故障影响整体系统的可用性,而在系统开发时可以考虑使用防御性编程。

1.系统容错

系统容错指的是系统在发生局部错误或者故障的时候,仍能够继续提供服务而不中断,其关键在于自动触发容错机制,尽量避免人为参与。系统容错的常用手段有6个:重试、熔断、降级、超时、限流和隔离。

下面先看两个系统容错手段的实现案例。

案例1:在社交媒体(如微博)中,用户发布内容时,如果遇到写入数据库失败的情况,可能会导致内容丢失。然而,如果在写入数据库失败时,能够将该内容作为一条消息写入消息队列,并配置一个消息队列的处理程序来消费这些异常消息,然后重新将其写入数据库,那么在数据库短暂故障期间,系统就能够很好地容错。这是降级的一个实现案例。

案例2:在系统架构设计中,网关通常充当系统的入口,负责接收和转发外部流量。所有进入系统的流量都必须由网关进行转发,因此,网关的可用性对整个系统至关重要。如果一些非核心接口的响应速度较慢,导致网关的线程资源被阻塞,那么网关转发流量的效率就会降低,进而影响整个系统的可用性。为了解决这个问题,可以考虑将响应速度较慢的非核心接口隔离到一个独立的“慢”网关上,这样就能够防止这些接口影响整个系统的可用性。这是隔离的一个实现案例。

系统容错是面向失败编程的重要实现方式,也是本书的重点内容,将在第2章详细介绍。

2.防御性编程

防御性编程是一种比较常见的编程方法。顾名思义,防御性编程指的是在编程过程中对于可预见的错误提前采取防御性措施,以避免系统崩溃的方法。

我曾处理过一次系统故障,这个故障的根源是系统运行过程中一个异常被吞没,使得某个比较耗时的初始化方法没有被正常初始化,而系统每次请求都要调用这个初始化方法,使得系统整体的响应时间异常延长,最终导致了系统崩溃。

常见的防御性编程有以下3种。

● 输入验证:对系统接收到的所有输入数据进行有效性验证,确保输入数据符合预期的格式、范围和类型,防止用户恶意输入造成安全漏洞和错误。

● 错误处理:合理地处理各种可能的错误场景,如类型转换错误、依赖系统故障、网络异常等。及时捕获和记录异常信息,采取适当的措施进行错误恢复或提示用户进行操作。

● 降级开关:任何的线上变更都需要增加降级开关,以保证一旦出现问题便可通过操作降级开关实现快速回滚。 IDuOIHSs2H8s+MNTHvbP6Xt+FYvm37r3cnozj2bSMbb/RuyUAIYBLSgDs5v+sPy7

点击中间区域
呼出菜单
上一章
目录
下一章
×