防御性编程思想
子程序应该不因传入错误数据而被破坏,哪怕是由其它子程序产生的错误数据。
其核心思想是:我们要承认程序都会有问题的,都是需要被修改,聪明的程序员应该根据这一点来编写代码。
防御性编程案例
1、保护程序免遭非法输入数据的破坏
如何应对?
(1)参数验证:检查所有来源于外部的数据的值;
数值取值范围、字符串长度、sql注入字符串等。
(2)检查子程序所有输入参数的值;
(3)决定如何处理错误的输入数据;
(4)redis大key、大value;
(5)重复请求,业务接口幂、分布式锁等;
(6)接口是否越权、返回敏感数据;
2、断言
3、错误处理技术
(1)返回中立值;
(2)换用下一个正确的数据;
(3)返回与前次相同的数据;
(4)换用最接近的合法值;
(5)报告信息 记录到日志文件中;
(6)返回一个错误吗;
(7)调用错误处理子程序或对象;
(8)当错误发生时显示出错消息;
(9)用最稳当的方式在局部处理错误;
(10)关闭程序;
4、异常
5、隔离程序,使之包容由错误造成的损害
(1)使用线程池隔离;
(2)熔断、降级、限流、业务开关等;
(3)拆分服务、拆分服务依赖的资源如数据库、redis等;
6、资源枯竭,内存泄露,导致OOM
(1)不要无限制的创建资源,要重复利用;
(2)使用容量限制的容器;
(3)分页查询数据,不要全量全表查询;
7、线程安全
8、接口升级,版本兼容性
9、缓存设计,缓存击穿要兜底,过期设计去热点,存储容量需考虑
10、数据库读写分离,需要考虑数据库主从延迟,引起的数据一致性问题
11、接口超时重试,需要保证幂等、数据一致性
参考
[代码大全2中文版(完整清晰版)].pdf: https://url97.ctfile.com/f/36436597-577967978-b8f29b?p=1988 (访问密码:1988)
https://interrupt.memfault.com/blog/defensive-and-offensive-programming
https://enterprisecraftsmanship.com/posts/defensive-programming/
https://blog.csdn.net/doctor_who2004/article/details/123297487?spm=1001.2014.3001.5501