生产环境中执行一个财务业务相关的定时任务,但执行完任务进行数据核对时无法对准。
具体的场景大概可以描述为:一批订单进行分类存储在另一张表中,每个类别的数量统计后放入一个字段中。但最终第一张表进行COUNT(*)计算的结果与第二张表中SUM(orders_by_type)的结果不同,总是差了几单。
想到应该是从第一部分查找,到组装逻辑直到最终存放分类数据的这个过程中发生了问题。于是将关键的几个步骤打了日志,放到生产环境执行一次任务后对比了这些日志,最终确定了是在这个过程中,流程可以细分为:
1.对这批订单打标记;
2.对这批订单进行处理,在处理的过程中有部分订单发生了异常,即跳过了未处理;
3.对处理完成的订单进行合并分类存放
问题出在第2步,发生异常后没有对之前标记的订单进行还原处理,导致最终两边的数据不通。
----------------------------------------------------------------------------------------------------------------------------------------------
与公司前辈讨论了一下,财务模块的数据无法核对上是开发过程中比较普遍的bug。比较妥当的做法是,将生产环境的订单数据拷贝一份,放入测试环境,而后进行调试。这样在写数据时,可以将风险降至最低。如果有条件,其实可以在开发时期就创建一批量的数据,并将该组数据保存,制作脚本不断地进行这个流程的测试与计算核对。这个过程如果是使用方也不是很明白,那最好拉着他们一起进行测试核对,毕竟钱的事情不是小事。如果是生产环境产生问题,那么就将数据存入本地DB,再进行反复调试与验证。
另外,财务的计算逻辑和处理流程一般是比较复杂的,所以设计代码时还是应该将代码的函数单一原则尽量执行,而对于一些分类处理,可以使用好模板模式,在父类处理好通用逻辑,在子类处理好各自不同的逻辑。