何谓系统稳定性?
控制系统理论认为:系统受到某种干扰而偏离正常状态,当干扰消除,如果系统的扰动能逐渐收敛并最终恢复正常状态,则系统是稳定的,反之,系统偏离越来越大,则是不稳定的,所以,稳定性是系统抗干扰和返回平衡状态的能力。
对于经典的传递函数的软件系统,一般我们讲的稳定指的是BIBO稳定,即有界输入有界输出稳定。一个系统如果对任意有界输入得到有界输出,它就是BIBO稳定的。一句话,稳定的系统对于各种输入需要有符合预期的输出。
随着软件复杂性越来越高,稳定性的保障越来越难,随着服务规模越来越大,稳定性的重要性越来越高。阿里行癫把稳定性比喻成木桶的底板,如果稳定性出问题,则滴水不留,所以,工程师在设计和开发软件的时候,要坚持底板思维。
但我们的软件需求和计划很少考虑非功能部分,然而软件的结构和实现却有非常大的比重服务于此,这也许是软件项目计划经常延期的重要原因。
如何保障稳定性?
虽然理论上没有绝对稳定的系统,但我们依然可以有所作为,使我们设计和开发的系统在生产环境接近稳定运行。
从大的方面讲,稳定性保障,可以分成3个部分:
制度纪律
-
编码规范、代码提交门禁
Code Review
静态代码扫描,动态代码分析
Unit Test、压测
灰度发布、Rollback、应急预案
监控
复盘、故障树分析
思想之道
-
保持简单、降低复杂度
不(零)信任、面向失败设计
实践之术
-
冗余设计(数据、计算、带宽冗余)
快速恢复设计(无状态设计)
容错、灾备
熔断、隔离
限流
有损服务