最近项目上有个“同步订单的业务补偿”的需求,大致背景是第三方调我们的同步订单接口给我们推送数据,我们做一系列业务逻辑。但是有时由于其他服务不可用之类的原因会导致第三方在有限的重试次数内没有成功推送数据给我们,后续不会再重试同步了。这会导致数据不一致。因此需要我们做业务补偿:对订单同步的请求数据做日志记录。启用定时任务自动重试来进行业务补偿。相当于是没有了第三方同步失败有限重试次数的制约,我们自己可以控制重试,直至重试成功。
实现原理:
1、考虑到以后其他接口可能也需要业务补偿,因此我们使用自定义注解,注解可以指定类型,方便针对不同类型做个性化的逻辑处理;
2、建立数据日志表和重试控制表,数据日志表记录了完整的接口参数(建议使用结构化存储,不要使用clob大字段),重试控制表主要记录接口请求状态是成功还是失败、失败异常msg、重试次数等,两个表通过数据id关联。
3、利用spring aop,对使用此自定义注解的方法进行拦截,分别使用@Before,@AfterReturning,@AfterThrowing 。before记录原始数据(没有状态),AfterReturning里面根据处理结果改变状态,AfterThrowing 里面记录失败状态和异常msg.
4、开启定时任务,每隔30分钟自动从重试控制表中拉取所有失败状态的数据,然后查询到对应的数据日志,转换成原始接口方法需要的参数格式,然后调用原始接口方法进行业务补偿。