系统健壮性设计
「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
1.代码评审
1.1 什么是烂代码
人的视角
- 维护者脏话的频率
- 维护者脏话的类型丰富
- 存在打架斗殴的可能
- 面向离职的编制
代码视角
- 不遵循代码规约
- 代码向迷宫
- 代码流程脚踩西瓜皮
- 代码执行效率低
- 10行代码15个bug
1.2 代码的恶性循环
- 业务催的紧,直接写代码
- 没时间填坑,却不断挖坑
- 到处灭火,更是没有时间CodeRevew
1.3 程序员的自我修养
1.4代码评审
1.5CodeReiew的"副作用"
- 提高自己的抗打击能力
- 对于自己错误的深刻理解
- 交流中碰撞出激情的火花
- 有可能锻炼肺活量
2.健壮性与鲁棒性
2.1健壮性度量
从架构层面: 负载均衡容灾能力
从代码层面: 参数校验, 异常处理, 分支覆盖
环境层面: 混沌工程,异地多活
2.2 负载均衡
2.3容灾能力
限流: 策略地丢弃部分用户请求
降级: 部分功能不可用 或用户体验被降级
熔断: 服务全部停止响应, 以保护核心流程
灾备: 复制多份系统能力或 解决数据核心服务单点问题
3.如何构建健壮性的系统
3.1 数据健壮性
- 逻辑删除, 杜绝物理删除
- 定时本地备份, 可以作为数据日志快照
- 主备准实实时备份,快速切换服务能力
- 定时云端离线备份,防地震,防水灾
3.2代码健壮性
封装: 是一种对象功能内聚的表现形式,主要是被封装的组件、类、方法的影响半径尽可能地小,这也是提升系统健壮性的一种思维方式
4.面向失败的架构思维
4.1面向失败设计
在软件生命周期中,也会出现各式各样的问题,我们需要通过面向失败的设计,防范和监控已知的确定性风险及未知的不确定风险:
- 任何环境都是不可信赖的,都需要对环境进行预处理
- 任何外部依赖接口都有可能出错
- 任何异常都需要响应和处理
- 任何行为都需要日志记录的
- 任何系统的上线都需要经过严酷的测试
4.2健壮性测试
- 功能测试: 想象用户的一切可能行为进行正确性验证
- 稳定性测试: 确定系统长时间在正常压力情况下运行的有效性
- 性能测试: 系统能够提供的最大服务级别的能力
- 混动工程: 确定线上系统故障的恢复能力