关于鲁棒性的思考

Posted 阿里巴巴淘系技术团队官网博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于鲁棒性的思考相关的知识,希望对你有一定的参考价值。

在计算机科学中,鲁棒性(英语:Robustness)是指一个计算机系统在执行过程中处理错误,以及算法在遭遇输入、运算等异常时继续正常运行的能力。 

鲁棒性关注的重点在于系统的稳定性,在不同场景下衍生了复杂的设计考量,且本身是一个广泛且难以具像化的特性。因此,针对特定目标实现鲁棒性分析,形成切实可行的鲁棒性意识,保障安全性。

基于鲁棒性分析,以设计规约为目标,有三个维度可以拆解:输入、处理、输出;以代码规范为核心,我们可以从三个方面来分析,分别为:代码质量、代码性能以及代码优雅。

设计规约

  失败设计思维


针对输入和处理环节,失败设计思维是保证鲁棒性的有效设想。该思维要贯穿代码生命周期始终,把失败当作代码设计中合理存在,提前准备好从运行失败的场景中恢复。倡导防御式编程思想,拒绝契约式编程。

  • 入参判空、有效性检验。

  • 系统设计时识别弱依赖,并针对性地设计降级、限流等应急预案,保证核心逻辑正常可用。

  • 在考虑主干功能的同时,要充分考虑评估异常流程与业务边界。

  • ......

正例:当系统弱依赖于多个外部服务时,如果下游服务耗时过长,则会严重影响当前调用者,必须采取相应降级措施,比如,当调用链路中某个下游服务调用的平均响应时间或错误率超过阈值时,系统自动进行降级或熔断操作,屏蔽弱依赖负面影响,保护当前系统主干功能可用。

反例:用户在淘宝付款过程中,银行扣款成功,发送给用户扣款成功短信,但是支付宝入款时由于断网演练产生异常,淘宝订单页面依然显示未付款,导致用户投诉。

  图式表达设计


针对处理环节,图式表达设计保证鲁棒性的有效举措。在复杂多变的业务场景中,图式表达往往能够以清晰、结构化的展现业务关联关系,对技术链路包括失败异常分支也有充分的分析帮助。

  • 如果某个业务对象状态超过3个,使用状态图来表达并且明确状态变化的触发条件;状态图的核心是对象状态,首先明确对象有多少种状态,然后明确状态间是否存在直接转换关系,再明确触发状态转换的条件是什么,最终输出状态转移图。注:状态图中的状态在代码中必须集中定义。

  • 如果系统中某个功能的调用链路上涉及对象超过3个,使用时序图来表达并且明确调用环节的输入与输出。时序图反映了一些列对象间的交互和协作关系,可以清晰立体地反映系统间调用纵深链路。

  • 如果系统中模型类超过5个,并且存在复杂的依赖关系,使用类图来表达并且明确类之间的关系。

  • 如果系统中超过2个对象之间存在协作关系,并且需要表示复杂的处理流程,使用活动图来表示。

  • ......

正例:淘宝订单状态有已下单、待付款、已付款、待发货、已发货、已收货等。比如已下单与已收货这两种状态之间是不可能有直接转换关系的。

  异常错误处理


针对输出环节,异常错误处理是保障鲁棒性的重要依据。业务代码必然会有错误失败出现,是否符合预期表现,是否在正常处理流中,是否可以快速对错误定位,往往要有一定的判断依据。面对异常分支,就需要异常错误输出,也是系统监控的基础。

  • 错误码设计。错误码能够快速知晓错误来源,同时也能给予依赖者的确定性表达,提高鲁棒性。

  • 异常日志输出。控制异常日志输出级别,error级别只记录系统逻辑出错、异常或者其他重要的错误信息。

  • ......

  实战Case


  • 需求背景

聚划算章鱼互动升级为“聚财气”频道,新增气泡奖励玩法。气泡奖励分登录奖励和时长奖励,其中时长奖励包括奖励1倒计时30秒、奖励2每日9点以及奖励3每日20点。

场景演示:用户在10:00进入频道后,收取完登陆奖励,唤起了一个30秒后的奖励的气泡;30秒后用户点击领奖,唤起了一个提示今日20:00可领的提示(该奖励未领);用户次日再来,收取完登陆奖励后唤起了30秒后的奖励气泡....


实现效果

以上是关于关于鲁棒性的思考的主要内容,如果未能解决你的问题,请参考以下文章

盘点

二叉树遍历操作的实现以及鲁棒性的完善

语义分割:如何评估噪声对医学图像分割的有效性和鲁棒性的影响?

[机缘参悟-68]:深度思考-人的心理系统与软件系统模型与性能指标比较(可用性可靠性可维护性鲁棒性适应性反脆弱性成熟性)--- 人工智能启示

Scan Context++:在城市环境中具有鲁棒性的位置识别描述子

Scan Context++:在城市环境中具有鲁棒性的位置识别描述子