系统健壮性设计
这节课是孤尽老师上课,讲了很多系统健壮性方面的设计思想,内容很多,需要细细品味。
一、代码评审
系统健壮的基础其实是优良的代码,怎么保证优良的代码,孤尽老师给了解决方案,就是代码评审,code review,简称CR。
1.1 什么是烂代码
从人的角度
- 维护者脏话的频率高
- 维护者脏话的类型丰富
- 存在打架斗殴的可能性
- 面向离职编程
代码角度
- 不遵守代码规约
- 代码像迷宫
- 代码流程脚踩西瓜皮
- 代码执行效率低
- 10行代码15个bug
烂代码如何产生
- 业务催的紧直接写代码
- 没时间填坑,却不断挖坑
- 到处灭火,更是没有时间CodeRevew
1.2 程序员自我认知
星级程序员标准
- ※写出计算机可以理解的代码
- ※※ 写出未来自己可以理解的代码
- ※※※ 写出别人可以自我理解的代码
自我修养的过程
1.3 代码评审
代码评审的好处
- 团队成长:养成团队成员间的交流文化,有利于团队的知识共享
- 提升代码规范度:通过代码审查,发现纠正不规范情况,慢慢形成良好开发规范
- 提高代码质量:工程师互相review,扫除知识盲区,提升代码的质量
- 熵减的过程:减少系统混乱
代码评审副作用
- 对于自己错误的深刻理解
- 交流中碰撞出激情的火花
- 锻炼肺活量
如何做代码评审
- 统一的编码与设计规范
- 完整的技术架构说明与示例
- 不定期的review会议:小项目(3月)10天一次,大项目15天一次;前期密集,后期考虑1月一次。
推荐工具
Phabricator: Facebook开源代码审查工具 Gerrit: CodeReview+代码托管 CheckStyle:代码规范检查工具
CR建议
- 对事不对人
- 至少一条正面评价
- PR内容一定要少
- 不要在review中讨论需求
- 明确各模块负责人
二、 系统健壮性
2.1 健壮性度量
2.2 怎么提高健壮性
负载均衡
土豪:F5; 屌丝:LVS
容灾能力
- 限流:有策略地丢弃部分用户请求
- 熔断:服务全部停止响应,以保护核心流程
- 降级:部分功能不可用或用户体验被降级
- 灾备:复制多份系统能力或解决数据核心服务单点问题
推荐方案:Sentinel阿里开源项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。
数据健壮性
数据是企业生命线
- 逻辑删除,杜绝物理删除
- 主备准实施备份,具备快速切换服务的能力
- 定时云端离线备份,放地震,放水灾
- 定时本地冷备份,可以作为数据日志快照
代码健壮性
代码规约
- 所有的POJO类属性必须使用包装数据类型
- DO、DTO、VO、POJO类属性不要设定任何属性默认值
- 定义数据对象DO时,属性类型要与数据库字段类型相匹配
- getter/setter不要增加业务逻辑
- 禁止在POJO中同时出现isXXX和getXXX
- 构造方法里禁止加入任何业务逻辑,如果有初始化业务逻辑,放在init方法中
异常处理规约
封装:封装是一种对象功能内聚的表现形式,主要是被封装的组件、类、方法的影响半径尽可能的小,这也是提升系统健壮性的一种思维方式。
三、总结
这篇暂时从第一个层面给一些系统健壮性的思路和解决方案。后续一篇继续分享孤尽老师更加高层面的一个思维:面向失败的设计和开发。