复杂业务流程书写探讨
背景
1.时效性不高的业务流程
2.流程含很多第三方接口调用
问题
在某个接口失败后,该如何快速且高效的处理以保证流程完整。
措施简述
上图是部分支付后分账记账流程,共需要调用三个接口。每个接口成功后都会向数据库更新很多数据(状态),如果调用核心手续费入账失败后如何处理。
曾经的处理方式:等有人反馈了在人工处理,查日志,找问题,最后可能还需要在写小程序去处理。这种方式很慢,很浪费时间,客户体验很差。
现在的处理方式:把流程按接口调用分成三个小的事务,记住每个事务的状态(成功,失败,未执行),在某个事务失败时,加入到定时任务处理队列中。定时任务每隔一段时间从对列获取失败的流程从头开始处理,遇到失败或未执行的流程则执行,成功的则跳过,直至最终流程完整结束。这种方式对客户更友好,节省开发找问题的时间。
流程图:
伪代码简单描述:
流程事务记录t={t1:未执行,t2:未执行,t3:未执行}
流程tfun=fun(){
//获取流程事务记录t
......
if(t.t1!=成功){
r=t1();
if(r=="失败"){
r.t1=失败
//保存记录体t,加入定时任务失败队列
.....
//退出
}
}
if(t.t2!=成功){
r=t2();
if(r=="失败"){
r.t2=失败
//保存记录体t,加入定时任务失败队列
.....
//退出
}
}
if(t.t3!=成功){
r=t3();
if(r=="失败"){
r.t3=失败
//保存记录体t,加入定时任务失败队列
.....
//退出
}
}
}
定时任务ttask=fun(){
//从队列中取任务
.....
// 执行失败流程 tfun();
.....
}