由于业务中存在不可控因素,包括网络、部署环境、客户端环境等等,系统出现错误不可避免。
如何妥善处理业务系统中的报错呢?本文以错误结果产生的影响这个角度来思考此问题。
一、最终结果正确类
例如IM软件,聊天消息下送失败,导致未收到此消息。解决方案如下:
1. 通过产品设计,抹平错误影响
发送时将聊天数据落地,接收人客户端重新获取数据即可,推拉结合保证结果不丢。
优点:最终正确
缺点:客户无法正确感知消息到达。
2. 发送端同步发送
采用可幂等的发送逻辑:系统报错时透传错误给客户端,发送端客户感知后重试即可。
优点:第一时间感知错误;
缺点:重试可能还是失败
产生的原因,大概率有以下2个大类:
分布式系统网络问题
系统负载问题
二、结果不正确
一个任务内操作多个数据记录,其中某步骤失败,数据未回滚,导致脏数据。
异步任务执行失败无法感知,导致结果不对。解决方案如下:
- 重要任务上事务,出错即回滚;
- 分布式服务的一次业务操作在一个服务内,避免分布式事务;
正确的操作步骤
根据业务重要与否,以及具体业务,考虑数据操作使用事务,执行失败即回滚业务。即使重试也不影响结果逻辑一致