系统稳定性建设

在软件工程中,系统的稳定性建设是非常重要的一环,不论是单点,还是整体,都需要做好稳定性的建设,在分布式系统中,通常一个系统是由很多个子系统或者小系统集成到一起,形成统一的对外能力,比如一个系统,我们可以拆分成多个模块,每个模块可以拆分出多个链路,每一个链路又包含多个接口,一层套一层,一环套一环,不积跬步无以至千里,不积小流无以成江海,我们只有做好每一点,每一环的稳定,才能达到整个系统稳定的目标

稳定性的建设可以从很多维度入手,比如技术维度,工程维度,业务维度等,接下来我们以工程维度为例子,从一个系统的建设周期来看如何做稳定性建设,在系统工程实施过程中,我们大体上可以划分出“设计”,“开发”,“测试”,“发布”,“运维”等子模块,针对每一个子模块,我们展开一些细节讨论:

设计原则

职责单一

职责清晰,单一,专人做专事同样适用于系统建设,明确上下文,划分好系统边界,避免大泥潭

简单为上

系统不做过度设计,好用的东西一定是简单的,美观的,复杂的设计带入了更多的维护成本,技术栈的加深会带来了更多不稳定的因素

开闭原则

不管是系统设计,还是底层的接口设计,都应该遵循这条原则,在实际系统建设中,开闭原则有助于防止各个领域层的腐化

冗余设计

  1. 数据冗余,异地多活,多个idc部署,比如两地三中心,具备机房容灾能力, 三地五中心,具备地域容灾能力
  2. 计算冗余,服务多实例部署,互为备份,容器化部署,能够弹性扩缩容,计算能力支持线性扩展
  3. 网络冗余,专线的备份,比如光纤断裂时能够切换到备份上去

无状态

无状态的服务能够支持无限水平扩展,节点的增加和宕机对整体提供的功能没有影响

去中心化

对于中心化的方式,好处是可以通过中心节点来管理、协调其他节点,但是中心节点的引入,带来了更复杂的问题,那就是中心节点的稳定性,可用性如何保证,很容易造成整个系统的瓶颈卡在中心节点上

使用成熟技术

是否经过充分的验证,是否有广泛的用户基础,有足够有经验的开发人员,是否有完善的文档和技术支持,如果是开源技术,是否有活跃的社区以及稳定的维护团队

组件标准化

标准化则比较典型的运用于系统交互协议标准化,数据模型标准化,服务标准化,标准化带来的好处也非常显著:

  1. 规范系统之间的交互方式,便于维护,管理
  2. 提升效率,避免重复造轮子
  3. 降低技术学习曲线,解放人员劳动力
  4. 信息理解无偏差,数据流动顺畅
  5. 服务约定明确,能力清晰,对接效率高

开发流程-质量保证

系统的开发质量很大程度上决定了是否具备更高的稳定性,千里之堤、毁于蚁穴,往往一个很小的点会引发整个系统的奔溃,所以,在开发阶段,需要严格把控每一个细节,将潜在的风险在系统建设阶段解决

  1. 需求评审,分析
  2. 技术方案设计,评审
  3. 编码规范
  4. codereview
  5. 开发自测 >> 冒烟测试 >> 系统集成测试 >> 用户体验测试 >> 测试报告
  6. 持续集成

容量建设

容量建设和规划一般从QPS,资源使用率,响应时间三个维度来进行,基于现在的业务模型估算出目标QPS和目标响应时间下,需要的系统资源
单系统压测
全链路压测
流量录制/回放,流量染色,影子库,影子表,资源隔离,数据隔离

发布

制定上线计划和上线流程,明确回滚方案
灰度发布/金丝雀发布

运维

监控告警

多个维度,多个视角监控,比如业务数据监控,系统资源监控,中间件监控,数据库监控确保系统故障能够及时被发现
多种方式告警,比如邮件,IM,短信,电话等,可以按照故障的重要级别选择不同渠道推送

熔断降级

控制故障范围,防止系统雪崩

故障演练

通过混沌工程来做故障注入,模拟实际生产中可能会遇到的故障,控制炸半径,揭露潜在问题

应急预案

需要在事前准备好应急预案,形成故障处理SOA,在故障发生的时候,能够快速处理,控制影响返回,快速恢复

复盘

复盘其实是一个很重要的,但是经常被我们忽略的事情,还是故障的复盘,还是演练的复盘,其实都是一个很好的机会去反哺整个保障能力,通过复盘的查缺补漏,提升保障能力的厚度,拉高整体水位