自我保护
自我保护是字面意思就是,通过对自身的防护,将自我保护好,避免受到外界伤害,在软件行业对架构设计时对系统本身的自我保护,防止服务因各种原因导致自身挂掉,从而提升系统的健壮性和鲁棒性。生活中这种例子也有很多,比较常见,如骑摩托车时,必备的防护装备有:头盔、护膝、护腕、手套等,通过这些行为来对自我的安全防护。
健壮性
健壮性是指软件对于规范要求以外的输入情况的处理能力。所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式,健壮性有时也和容错性,可移植性,正确性有交叉的地方。例如:
- 一个软件可以从错误的输入推断出正确合理的输入,这属于容错性量度标准,但是也可以认为这个软件是健壮的。
- 一个软件可以正确地运行在不同环境下,则认为软件可移植性高,也可以叫软件在不同平台下是健壮的。
- 一个软件能够检测自己内部的设计或者编码错误,并得到正确的执行结果,这是软件的正确性标准,但是也可以说,软件有内部的保护机制,是模块级健壮的。
软件健壮性是一个比较模糊的概念,但是却是非常重要的软件外部量度标准。软件设计的健壮与否直接反应了分析设计和编码人员的水平。即所谓的高手写的程序不容易死。
为什么印度人的软件业在国际上要比中国的好,除了印度人母语是英语的原因外,更重要的是因为印度人严谨,他们的程序更有健壮性。印度的一个老程序员,月代码量在一千行左右,这一千行代码,算法平实,但都是经过仔细推敲,实战检验的代码,不会轻易崩溃的代码。我们的程序员,一天就可以写出一千行代码,写的代码简短精干,算法非常有技巧性,但往往是不安全的,不完善的。印度人的程序被称作:傻壮。但程序就得这样。
写一段功能性的代码,可能需要一百行代码,但是写一段健壮的程序,至少需要300行代码。例如:房贷计算器的代码,算法异常简单,十多行就完成了,但是,这段程序完全不具备健壮性,很简单,我的输入是不受限制的,这个程序要求从用户界面读取利率,年限,贷款额三个数据,一般同学的写法很简单,一句
doubleNum = Double.parseDouble(JOptionPane.showInputDialog(null,”请输入”+StrChars)) ;
就万事OK了。
但是,真的有这么简单么,开玩笑,这么简单就好了,列举以下事例
- 我输入了负数
- 我的输入超出了double类型所能涵盖的范围
- 我输入了标点符
- 我输入了中文
- 我没输入
- 我选择了取消或者点了右上角的关闭
这一切都是有可能发生的事件,而且超出了你程序的处理范围,这种事情本不该发生,但是程序使用时,一切输入都是有可能的,怎么办,你只能在程序中限制输入。
作为研发工程师,如何让你的代码在执行的时候响应这些事件呢,我用了四十行代码编写了一个方法,用来限定我的输入只能为正实数,否则就 错,用户点击取消或者关闭按钮,则返回一个特殊数值,然后在主方法增加一个循环,在调用输入方法的时候检查返回值,如果为特殊值,就返回上层菜单或者关闭程序。
小结
研发工程师想要写一段健壮的程序,是非常不容易,可能某个功能代码100行,健壮程序可能就要几百行,其中可能包括非空、类型、合法性、条件验证、规则判断等一系列验证,见过很多工程师往往懒省事,对于有些验证,可能想当然认为是正常的,程序不非想当然认为的,不要相信任何人,只能通过程序来自我保护。
尽早拒绝
尽早拒绝是程序对参数或者其他的逻辑处理时,一旦发现不符合预期,尽早拒绝,将信息或错误返回给调用方。特别是在分布式系统中,一个请求可能要经过多个服务,如对参数类型、合法性校验,而不是尽可能在入口处就将其进行校验,而不是等真正用时才去校验,如果这时发现不符合预期,可能调用链已经变长了,原因是在这个过程中还耗费着系统的资源呢,对逻辑处理也是如此,及时校验、合法性,尽早拒绝。在生活中该例子也比较常见,例如你去看电影,首先在家选择所看的电影,时间段,是否有合适的场次,只有各个条件都满足的情况,然后购票去看电影,而不是直接去电影院,一旦发现没有合适的,岂不是白跑一趟。
快速失败
快速失败是服务间依赖,防止服务出现级联故障,如果你的微服务依赖于另一个系统来提供响应,并且该系统需要很长时间才能响应,那么你的整体响应 SLA 将受到影响。为了避免这种情况并快速响应,可以遵循的一个简单的微服务最佳实践是使用断路器使外部调用超时并返回默认响应或错误。断路器模式将隔离你的服务所依赖的失败服务,而不会导致级联故障,使你的微服务保持良好的健康状态。如方向走错了,再怎么努力也是枉然,做一件事,首先判断方向是否正确,是否符合自身,不然再怎么努力也是枉然,所以要尽早判断出来,一旦不合适,尽早调整方向,而不是努力很久发现方向正确。
拒绝过载
拒绝系统过载是避免系统提供超负荷的服务,一旦系统在过载的情况下,可能会影响其他正常的请求,当系统过载之后,要学会拒绝服务,拒绝服务可以是?种不得已的兜底?案,?以防?最坏情况发?,防?因把服务器压跨?长时间彻底?法提供服务。像这种系统过载保护虽然在过载时?法提供服务,但是系统仍然可以运作,当负载下降时又很容易恢复,所以每个系统和每个环节都应该设置这个兜底?案,对系统做最坏情况下的保护。在生活中也比较常见,如骑摩托车过红绿灯,假设当前左转专用道,只能等前面的车挨个过了之后,你才能过,假设出现红灯的情况下,那你就需要等待,否则可能就出现交通事故,而且专用车道还是单排而不是一个车道两个并行,是串行的,原因是公路就那么宽,只能承载一条车的车道。
拒绝过载包括:并发数、线程数或协程数,数据库连接数、队列,资源限制使用、内存等,而不是无限制或使用默认值。
风险控制
风险控制是对请求合法性、用户身份信息合法性进行校验,尽早拦截无效或不安全的请求,只放行可信任的流量,一般情况下可以通过对用户建立画像,会话信息、IP请求、流量特征提前、分析等各种策略来对流量进行校验其合法性,也可以通过指纹形式,在用户每次生成唯一的指纹,并对该指纹统计分析等,风险控制就是通过各种策略、来区分出合法请求与非合法请求,防止非合法请求对系统进行干扰。在生活中该例子也比较常见,如微信在登录新的设备是就会对其进行短信验证、或者绑定银行卡需要人脸识别。
总结
自我保护是通过对程序健壮性设计、尽早拒绝、快速失败、拒绝过载、风险控制等手段,通过以上手段,来提升系统的稳定性,在架构设计过程中,尽可能提前考虑,简单设计,不要相信任何人,只有程序才是最可靠的,人是不可靠的。程序可靠的前提是很好的设计,还必须是严谨的,经过严格测试的,自我保护只是稳定性建设其中的一个步骤,只有我们把每个步骤,做细做到位。有点类似生活中盖高楼大厦一样,只有每一步是扎实的,这样的高楼大厦才是坚固的。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!