可靠性设计包括新功能的可靠性设计和现有功能的可靠性改进设计。对需求规划阶段确定的可靠性目标和要求进行分解,在设计阶段分模块、分功能地进行应用架构设计、系统架构设计、部署架构设计。
设计错误比代码Bug带来的危害更高。这个阶段应当考虑设计的合理性,评估引入故障风险的可能性,在对风险有充分认识的基础上对单元模块的复杂性、健壮性进行设计。从不同的层次看架构会包括很多设计,从宏观视角来看包括部署架构、应用架构、系统架构、业务架构等,这里我们重点关注的是这些架构中的可靠性的设计工作。
架构设计阶段的可靠性工作要考虑容错、避错、改错的设计,也要充分考虑可扩展性、可维护性、可伸缩性的设计,以及如何应对突发大流量的设计。在核心模块应用逻辑中还要考虑如何进行降级、限流,如何隔离局部故障,如何做到异常时还能最大限度服务用户等设计。
1、业务架构设计
业务架构设计是把业务需求拆解为软件功能模块的需求。业务架构设计包括大模块的设计,也包括用户使用业务服务的交互流程。如业务架构可拆分为用户系统、交易/支付系统、订单系统、商品系统、库存系统、活动系统、推荐系统等,商品系统也可以按品类、行业进行拆分。业务架构会决定技术团队如何进行组织分工,业务架构的拆分方式也会影响可靠性工作的开展。
2、系统架构设计
系统架构设计是指整个软件系统的总体设计,这个过程把应用逻辑看作一个架构单元,把周边支撑模块、基础设施服务、中间件组件、数据库、数据存储等也作为独立的架构单元。系统架构主要考虑组件选型以及组件之间的调用关系。这些架构单元自身也是一个复杂的分布式软件系统,也有可靠性工作的问题。在调研开源组件、开源框架时需要深入熟悉其中的设计原理才能充分用好它们,即使用了成熟的开源框架,也要考虑与公司现有技术栈、基础设施服务等的融合。
实践经验:很多公司有架构委员会,当对架构进行重大改进、建设新的中间件、引入新组件时会引入评审过程。架构师会提出设计中的可靠性风险,洞察未能关注到的点,提供更优的设计建议。
3、应用架构设计
应用架构设计是指根据业务需求设计应用的层次结构,制定应用规范、定义接口和数据交互协议等。包括应用进程与应用进程的通信机制、应用与数据进行通信的架构,选用同步通信或异步通信方式,采用RPC、RESTful、JSON、XML等进程间通信协议。也包括应用内的逻辑设计、代码结构设计,如何设计分布式的事务,如何设计缓存服务和策略,如何设计高可用的数据库等。
实践经验:基础架构和微服务框架团队,会不定期分析生产环境微服务运行过程,特别是异常后的处理过程,进行改进。如增加监控(如队列监控、内部状态)、增加配置项参数、增加可靠性相关能力(如拨测能力)等。
实践案例:在某个阶段发现有状态的服务很多,在异常时无法迁走、无法调度切换,此时SRE发起无状态化改造项目,进行微服务自身、硬编码IP、DB资源、缓存资源、外部依赖的无状态化改造。
4、部署架构设计
部署架构设计是为了在不够可靠的基础设施上建立可容灾的高可用系统,在设计时选用合适的云厂商、IDC机房、服务器、网络,如同城双活、异地多活等。有时也叫运维架构或基础设施架构。
实践经验:基础架构和SRE团队在适当的时候发起部署架构的改进项目,如遇到单交换机挂掉后影响一片服务的情况,发起交换机隔离的治理项目;又如发现物理机挂了导致整个微服务挂掉,所以在容器平台增加宿主机反亲和的功能等;再如在某个阶段发现某些核心服务有单机房故障风险,于是发起同城双活架构改造的项目。