一笔海外子公司的销售订单已经进入总部系统,单据本身存在,后续流程却走不动。运维页面上连续出现接口失败、主数据校验失败、后台任务重试失败等提示。此时最危险的操作,是看见一串红色消息就把它们全部清掉。消息可以消失,订单依然可能无法交付,下一次处理还会失败。这个场景很适合借《仙剑奇侠传 1》的鬼枯藤来讨论 ABAP 中的修复机制,因为鬼枯藤并非单纯补血,而是针对几类中毒状态发挥作用,并伴随体力损失。
物品资料对鬼枯藤的描述是,它可以解除赤毒、尸毒、瘴毒、毒丝。一份道具图鉴还记载了使用后体力减少三十点的效果。不同资料对细节的记录并不完全一致,因此这里以「解除指定状态,并付出明确代价」作为讨论依据,不把游戏数值当作 SAP 的业务规则。对应到 ABAP,系统没有名叫鬼枯藤的内置语句、函数模块或框架组件,但完全可以设计出行为相似的业务操作,它识别允许处理的异常,只消除这些异常,同时留下可检查的处理成本和结果。
这里的「毒」需要先定义清楚。业务系统中的异常不是一种东西。销售订单缺少交货工厂,属于业务数据不完整。接口消息格式不符合约定,属于集成数据问题。后台任务因为临时连接故障而失败,属于运行环境问题。某个字段被错误的增强逻辑反复改写,则属于程序行为问题。它们都可能让流程停住,却不能共享一个无条件的「解毒按钮」。如果问题源自网络连接,修改订单字段没有帮助。如果问题源自定价条件,删掉应用日志也不会使价格正确。
鬼枯藤这个比喻最有价值的部分,是它强调适用范围。假定我们的系统把异常状态分为赤毒、尸毒、瘴毒、毒丝与其他状态,修复动作必须逐项判断哪些状态可由它处理。一个业务对象同时带有两种可处理异常和一种不可处理异常时,操作应当只清除前两种,并明确报告第三种仍然存在。不能因为某一项修复成功,就把整张单据标成健康。SAP 的业务流程往往跨越订单、交