提高程序的健壮性和正确性
概述
程序的健壮性和正确性,是信息系统的最重要指标。
本文探讨如何提高程序的健壮性和正确性。
概括来讲,三招:
1、 AHC模型
2、 RPC模型
3、 数据一致性检验
下面详细论述。
什么是健壮性
健壮性是指程序可以适应正常和非正常的运行环境,都可以正确地运行;随着业务量的增加,不会出现阻塞和不可用的情况。
影响程序健壮性的因素
1、 没有容错控制
2、 执行耗时的操作
3、 执行复杂的任务
4、 数据不一致
5、 算法效率低
6、 不能应对大流量冲击
什么是正确性
1、 不可重入的任务被重入
2、 没有前置状态判定
3、 没有遵守“受理—处理—关闭”AHC模型
4、 没有遵守“申请—前置审批—审批—善后—完成”RPC模型
5、 数据库复制造成数据延迟
业务单
“受理—处理—关闭”AHC模型
AHC=Accept/Handling/Close
该模型适合关键性的功能执行。
AHC模型可以避免任务被多次执行!
应用场景:
1、 余额操作
2、 RPC模型中的善后操作。
受理
1、 Update BizSheet set Status=locked,TimeUpdated=getdate() where id=$id$ and status=前置状态
2、 如果返回1,继续。否则结束处理。
处理
3、执行具体操作。
关闭
4、Update BizSheet set status=后置状态,TimeUpdated=getdate() where id=$id$ and status=locked
错误处理
6、 获取半个小时前处于错误状态下的任务:select * from BizSheet where status=locked and TimeUpdated<dateadd(mi,-30,getdate())
7、 对每个任务单执行逆向操作:【也可以正向操作】
a) 执行逆向操作,清理出错现场。
b) Update BizSheet set status=前置状态,TimeUpdated=getdate() where id=$id$ and status=locked
“申请—前置审批—审批—善后—完成”RBC模型
RPC=Request/Pre Approval/Approval/Handling/Close
每一个申请、审批业务,均可以分成5步完成。
1申请
无需控制。如果要限制一种业务只申请一次,则需要在上一个层次的业务中控制。
2前置审批
前置审批是一个后台Worker,它的任务是根据申请条件,将申请单设置成可以审批或被驳回的状态。
前置审批也可以用来避免多次重复的申请。
3审批
人工操作。要么同意,要么被拒。
Update BizSheet set status=同意or被拒 where id=$id$ and status=Accepted
4善后
按照AHC模型处理。
5完成
完成状态是由第四步来设置的。
常见的错误
先判定再执行而不是AHC模型
典型的应用场景:
1、 财务对某个申请单进行审批通过,对某用户返余额20元。
2、 判断该申请没有被审批过
3、 返余额20元
4、 将申请单设置成已审批
5、 结束
错误出现的场景:
两个用户同时对该申请单操作
或
操作员多次点击审核按钮
判定前置条件时使用了读库
由于数据复制经常出现延时,会造成主库数据已经更改,但读库没有被刷新。
错误的条件,造成任务被多次重复执行。
程序不是唯一实例的
你无法保证你的程序不是在多个机器上同时运行
即使一台机器,也可以启用多个实例,如IIS的多个WEB Farm。
只有AHC模型可以避免出现不正确的结果!防止重入!!
申请时候判断了条件,提交之后为什么不对了
1、 申请的时候条件是成立的,但是提交的时候,情况已经变化;如申请退款时候订单已经出库。
2、 多人提交同一申请。
责怪审批人没有责任心
这是不对的。
优秀的信息系统可以避免工作人员犯错误。
采用RPC模型可以避免这类错误。
我的程序不会出现错误
这是极端错误的认识。
在下列情况下错误在所难免,我们能做的只有降低风险。
1、 异常的断点或断网
2、 黑客攻击
3、 内鬼修改数据
4、 员工试错
5、 其他原因
数据一致性检查
数据一致性检查可以及时发现程序中的问题或数据被错误修改的情况。
数据一致性检查在程序刚上线时,特别有效。可以避免程序出现不正确的逻辑。