[0085] 现有技术中,为了实现分布式事务,一般会先固定好一组分布式事务,记为T1、T2、T3…Tn,其中Ti是平等的子事务。对应每个子事务会设置对应的补偿子事务C1、C2、C3…Cj,其中0
[0086] 为了解决上述问题,基于上述架构,本发明实施例提供了一种分布式事务的流程保障方法,如图2所示,本发明实施例提供的分布式事务的流程保障方法包括以下步骤:
[0087] 步骤201、接收调用系统发送的处理请求。
[0088] 具体实施过程中,系统提供可以对外调用的消息服务接口,接口可以设计为多个,每个接口定义了消息的结构和字段含义等配置信息,具体地,设置了对应的接口请求报文字段和响应报文字段的业务含义定义,还包括字段的类型、长度、是否必填、使用描述等说明。从而本发明实施例中的设备可以通过接口接收外部调用系统发送的处理请求,并通过接口向外部调用系统反馈响应报文。
[0089] 步骤202、根据所述处理请求确定主流程以及N个子流程,N≥1。
[0090] 具体实施过程中,一个新的处理请求进入后,通过解析处理请求的请求报文字段等信息,结合系统控制的配置业务字段,确定该处理请求是否为合法的请求,配置的字段可以为调用系统的ID、业务请求渠道号等等。
[0091] 一个合法的处理请求接收后,根据处理请求所携带的业务信息项,经过解析处理,将匹配出对应的主流程和子流程实例。本发明实施例中设计有主流程、子流程的类型定义,以及流程匹配工厂类。
[0092] 对于主流程而言,主要的业务信息项包括:请求的渠道、业务场景ID、合作方ID、摘要代码、借贷双方账号类型等,可以根据实际需要纵向或横向扩充,最后匹配得到主流程类型。
[0093] 子流程是在主流程类型确定后根据更多一些维度的业务信息项,确定的细分流程。举例来说,客户张三通过扫码支付,买了一杯咖啡30元。经解析后,主流程匹配结果是消费流程,而不是退款或其它。进而,子流程则会根据张三是否有银行理财账户来确定是否需要联动银行理财账户和银行卡。因此,同一个主流程下的子流程可能不一样。如果没有开通银行理财账户,那么子流程可能是银行卡单卡消费;如果开通了银行理财账户,那么子流程则是银行理财账户与银行卡的联动消费。子流程类型的匹配也是通过一个矩阵类设定的,根据业务需要不同可以横向和纵向扩充。
[0094] 步骤203、针对所述N个子流程中的任一子流程,将所述子流程向对应的子系统发送,以使所述子系统对子流程进行处理。
[0095] 具体实施过程中,一个处理请求,会确定一个主流程和下挂的多个子流程,这是一个双层交易的模型。主流程主要用来跟踪控制整体分布式事务处理的进度和状态、冲正状态、异常信息等。子流程则会对应到一个具体的与远程系统的交互,同样设定有子流程状态、子流程的冲正状态、异常信息、远程调用类型等等信息。本发明实施例中可以按照子流程处理步骤以及对应的子流程的信息,通过远程调用工具将子流程的报文发送到相应的子系统进行远程事务处理。
[0096] 多个子流程之间可以是同步处理的也可以是异步处理的。以张三买咖啡的例子说明,假定张三银行卡余额为10元,同时也有理财产品的份额为100元,那么针对这次买咖啡的消费请求生成的主流程为消费流程,子流程则会包含:
[0097] 1、到银行理财系统冻结理财产品的份额20元;
[0098] 2、到存款核心系统进行分组一对一转账交易30元,其中10元从银行卡出金,20元从在途清算资金出金;
[0099] 3、到银行理财系统进行理财产品的份额赎回处理,并完成在途清算资金的清算处理。
[0100] 以上三个子流程中,子流程1和2是同步流程,也即需要即刻执行并等待返回结果。子流程3则是异步处理流程,可以等前面的同步子流程1和2都执行成功并返回了之后,再择机进行处理,并根据子流程的类型可以进行不同的处理。这样,可以让同步处理操作的时效性更高,提高系统的整体吞吐量。
[0101] 步骤204、对N个子流程的处理过程进行监控,当任一子流程的处理过程出现异常时,根据异常类型、所述主流程的类型以及所述子流程的类型确定对应的异常处理策略。
[0102] 具体来说,本发明实施例中的反向操作流程,同样采取主子流程模型的方式进行处理。同时反向操作流程的子流程和原流程的子流程可以是一一对应,我们称为对称式反向操作,也可以反向操作流程的子流程和原流程的子流程不一一对应的,但是反向子流程执行完的效果与全部原子流程未执行的效果等同,我们称之为非对称式反向操作。下面以冲正流程举例说明对称式反向操作和非对称式反向操作。
[0103] 对称式冲正:
[0104] 假如张三买咖啡时,自己银行余额有30元,足够买一杯咖啡,那么实际上的主流程为消费流程,子流程只有一个,即“核心一对一转账”,不需要联动银行理财账户,所有的消费金额均从银行卡出金。假定,存款核心从银行卡出金消费出现异常,但此时张三的银行卡中已转出金额30元,那么需要设置对应的冲正子流程,且冲正子流程也是一个,即“核心一对一冲正”,只需要到存款核心冲正原来的那笔消费交易即可。这种情况下,原流程和冲正流程是完全对称的,如图3所示。
[0105] 非对称式冲正:
[0106] 如果张三的银行卡余额为10元,不足30,银行理财产品中有100元,那么实际上的主流程为消费流程,子流程有三个,即“冻结理财产品”、“核心一对一转账”和“理财解冻并赎回”。但是在原流程完成后,外部发起了冲正交易,若是对称式冲正,需要针对三个子流程设置三个冲正子流程,即“理财产品解冻”、“核心一对一冲正”和“理财产品买入”,即向银行卡中退回10元,并重新买入20元的理财产品。而非对称式冲正,可以设置一个冲正子流程,例如为“核心一对一转账”,直接向银行卡中退回30元,那么对应的冲正子流程只有一个,而原子流程有三个,从而是非对称式的,如图4所示。此时对于张三而言,其资产并没有减少,即冲正后的效果与原子流程未执行的效果等同,而操作过程相较于对称式冲正,则极大地进行了简化。需要说明的是,非对称式冲正不仅为冲正子流程的数量与原子流程的数量不同,也可以是冲正子流程的数量与原子流程的数量一致,但不一一对应,例如上述例子中,可以分三笔,每笔向银行卡中退回10元,这种情况也属于非对称式冲正。
[0107] 步骤205、根据所述异常处理策略对子流程进行异常处理。所述异常处理包括对已经处理成功的子流程执行非对称反向操作,所述非对称反向操作为执行反向操作子流程,所述反向操作子流程与所述已经处理的子流程非对称。
[0108] 这里的反向操作,可以为对子流程的回滚操作,也可以为对子流程的冲正操作,也可以为对子流程的冲账操作。
[0109] 本发明实施例中,接收调用系统发送的处理请求,对处理请求进行解析,匹配出对应的主流程和N个子流程。对于N个子流程,依次将子流程向对应子系统发送,以使子系统对子流程进行处理,同时对N个子流程的处理过程进行监控,当任一子流程的处理过程出现异常时,根据异常类型、主流程类型以及子流程类型确定对应的异常处理策略。根据异常处理策略对子流程进行异常处理,其中,异常处理包括对已经处理成功的子流程执行非对称反向操作,这里的非对称反向操作为执行反向子流程,且反向子流程与已经处理的子流程非对称。本发明实施例中,对子流程的异常处理可以是对称式反向操作,也可以是非对称式反向操作,可以根据实际情况和场景灵活设置异常处理策略,从而灵活地解决分布式事务异常问题。
[0110] 进一步地,为了控制消息流量,减少系统压力,本发明实施例中,所述接收调用系统发送的处理请求,包括:
[0111] 统计接收到的处理请求的数量;
[0112] 若所述处理请求的数量大于流量预警值,则向所述调用系统发送预警消息,并控制向所述调用系统反馈响应报文的时间。
[0113] 具体实施过程中,将全天候监听接收到的处理请求的数量,接收到一个新的处理请求时,计数器变量增加1,同时,也可以根据接口的类型不同,设立不同的流量计数器,从而针对不同的请求类型或总的系统流量配置高流量预警值和最大值。当某类型请求的数量或总的处理请求的数量触发预警值时,可以提供消息预警;当达到最大值时,将限制响应报文立即返回给调用系统,以达到系统保护的目的。
[0114] 现有技术中,子系统提供异步处理的消息服务接口,但是一般分布式事务要求子系统同步反馈消息处理结果。为了解决这一问题,本发明实施例中,所述N个子流程中包括异步子流程;所述针对所述N个子流程中的任一子流程,将所述子流程向对应的子系统发送,以使所述子系统对子流程进行处理之后,还包括:
[0115] 针对所述异步子流程,以设置的频率向所述异步子流程对应的异步子系统发送结果查询请求,直至接收到所述异步子系统反馈的处理结果。
[0116] 本发明实施例设置了异步转同步的实现机制,较好地解决了子系统的异步接口无法满足同步返回处理结果的要求。具体地,将异步子流程发送至对应的异步子系统之后,根据主流程的流水号调用异步子系统的远程结果查询接口,获取异步子流程的处理结果。如未超过异步子流程的超时时间,则等待一定的时间间隔后,重试远程结果查询接口的调用,直到获取具体的返回结果。此外,若到设定的异步子流程的超时时间仍未获取到结果,则直接认为该异步子流程超时异常,将进入到异常处理逻辑。
[0117] 进一步地,所述根据所述异常处理策略对子流程进行异常处理,包括:
[0118] 针对所述异步子流程,执行重试处理。
[0119] 具体地,由于异步子流程的执行不需同步返回处理结果,因此,针对异步子流程出现异常的情况,可以对该异步子流程执行重试处理。
[0120] 在主流程或者子流程的执行过程中,如果明确发生业务异常或者技术性的异常,例如,转账时发生的账务状态异常、数据库异常等,本发明实施例中,可以子流程立即执行冲正处理,也可以是转异步任务的处理,具体可以根据需要进行配置,配置表本身也可以进行横向或纵向的扩展以适应业务的需要。
[0121] 另一类异常则为超时类异常。所述对N个子流程的处理过程进行监控,包括:
[0122] 对所述主流程以及每个子流程的处理时间进行监控,若所述主流程和/或任一子流程的处理时间超过对应的时间阈值,则确定出现超时类异常;
[0123] 所述根据所述异常处理策略对子流程进行异常处理,包括:
[0124] 针对异步子流程出现超时类异常,则对所述异步子流程执行重试处理;
[0125] 针对主流程和/或同步子流程出现超时类异常,向所述调用系统反馈处理过程超时,并确定超时子流程的处理状态;
[0126] 若所述超时子流程的处理状态明确,则对已处理成功的子流程执行非对称反向操作;
[0127] 若所述超时子流程的处理状态不明确,则对所述主流程转批量异步处理。
[0128] 具体实施过程中,超时类异常又分为以下不同的情况。本发明实施例中引入主流程超时时间和子流程超时时间。从接收到一个处理请求开始计时,到当前处理时间,主流程超时时间即针对上述时间段设置的一个系统阈值,用于判断一个主流程的执行是否出现超时的异常情况。如果主流程超过了设置的主流程超时时间,则对调用系统返回主流程超时的异常状态码,标识出该流程处于一个处理超时的中间状态。处理超时的中间状态对调用系统而言认为是处理失败,需要进行异常处理。具体地,需要获取超时子流程的处理状态,若超时子流程已经处理成功,则对于该超时子流程以及该超时子流程之前的已经处理成功的子流程,实施冲正处理,这里的冲正处理可以是对称式冲正也可以是非对称式冲正,最终使数据回到业务起始的等价状态。若超时子流程未处理成功,则对该超时子流程无需处理,只需对该超时子流程之前的已经处理成功的子流程实施冲正处理。而对于该超时子流程的处理状态不明确的,则对主流程转批量异步处理,例如,将需要批量异步处理的主流程集中起来,在每天固定的时间段进行处理状态的重新查询,再根据查询结果进行后续处理。将处理状态不明确的主流程转为批量异步处理方式进行持续的后续处理操作,可以确保异常交易的最终结果达到业务要求的一致性。
[0129] 批量异步处理是通过qrtz定时任务的方式来实现,针对不同类型的批量异步处理的主流程,可以配置不同的异步处理策略,例如任务的调度处理频度、调度的时间范围、调度处理的线程资源投入等。
[0130] 与主流程超时状态类似,子流程也设置有不同的超时状态的系统阈值。子流程的处理时间为从一个子流程发往对应的子系统那一刻开始计时,到当前的处理时间间隔。子流程超时即子流程的计时器所记录的耗时时长超过系统针对当前类型的子流程设置的超时时间系统阈值。不管主流程超时还是要求同步处理的子流程超时,都会影响请求的处理结果,系统将拦截到这些超时的异常并中断流程的执行,对外返回流程状态超时。
[0131] 此外,对于异步子流程出现超时类异常,由于该异步子流程的超时不影响当前请求的处理结果,因此,可以对异步子流程执行重试处理,这里的重试处理可以是发现异步子流程出现超时异常时,直接进行重试,也可以将该异步子流程执行批量异步处理,例如在每天固定的时间段内执行异步子流程的重试处理。当然,也可以根据配置对异步子流程执行冲正处理。
[0132] 进一步地,本发明实施例向调用系统提供格式一致的反馈结果。所述针对所述N个子流程中的任一子流程,将所述子流程向对应的子系统发送,以使所述子系统对子流程进行处理之后,还包括:
[0133] 接收子系统反馈的响应消息;
[0134] 将所述响应消息格式化,得到响应报文;
[0135] 将所述响应报文向所述调用系统发送。
[0136] 举例来说,某调用系统向交易处理服务器发送交易处理请求,交易处理服务器处理请求超时,返回了超时状态。调用系统可能会根据超时的特定异常码再到交易处理服务器中查询交易的结果,则需要根据具体的交易状态信息将返回的响应消息进行加工处理。
[0137] 另外反馈的响应消息的包装可以尽量做到,出现系统变动特别是出现新的系统语义时,经过消息格式化后,对外提供一致的稳定的输出结果。例如:超时异常码对外反馈的是000960,因为业务的需求又接入了新的下游方子系统,但是新接入的子系统的超时异常码是一个新的值比如XXXTIMEOUT,那么将响应消息格式化则需要将XXXTIMEOUT转化包装成跟调用系统约定的超时异常码000960,从而调用系统也能够识别到。
[0138] 为了更清楚地理解本发明,下面以具体实施例对上述流程进行详细描述,本发明具体实施例中,具体场景为用户使用手机进行快捷支付,系统架构包括客户端、交易处理系统、存款核心系统和理财系统,其中,存款核心系统和理财系统分别为子交易对应的子系统。
[0139] 具体实施例的步骤如下所示,包括:
[0140] 步骤S501:客户端向交易处理系统发送快捷消费支付请求。
[0141] 步骤S502:交易处理系统解析快捷消费支付请求,向存款核心系统发送余额查询请求。
[0142] 步骤S503:交易处理系统根据存款核心系统反馈的结果,确定用户银行卡中余额不足,且客户端设置为允许理财产品联动消费,则向理财系统发送余额查询请求。
[0143] 步骤S504:交易处理系统根据理财系统反馈的结果,确定子流程分别为“冻结理财产品”、“核心一对一转账”和“理财解冻并赎回”。
[0144] 步骤S505:交易处理系统向理财系统发送冻结理财产品请求。若理财系统执行成功,则执行步骤506。若理财系统执行失败,由于对分布式事务的结果没有影响,因此不用处理,直接向客户端反馈失败结果。若理财系统执行超时,则需要对冻结理财产品请求的处理结果进行核实,若失败则无需处理,若成功,则需执行冲正处理,即执行理财产品解冻。
[0145] 步骤S506:交易处理系统向存款核心系统发送扣款转账请求。若存款核心系统执行成功,则向客户端反馈扣款成功结果,并执行步骤507。若存款核心系统执行失败,则需要对已成功的“冻结理财产品”执行冲正处理,即执行理财产品解冻。若存款核心系统执行超时,则需要对扣款转账请求的处理结果进行核实,若失败则执行理财产品解冻,若成功,则执行异步赎回并更新状态。这里冲正子流程“异步赎回并更新状态”与子流程“冻结理财产品”和“核心一对一转账”之间即为非对称式冲正。
[0146] 步骤S507:交易处理系统向理财系统发送理财解冻和理财赎回的请求,其中理财解冻和理财赎回的请求为异步请求。若理财系统执行成功,则交易处理系统向客户端反馈赎回成功结果。若理财系统执行失败,则转批量异步处理,执行重试处理。若理财系统执行超时,则需要对处理状态进行核实,并可以人工干预处理。
[0147] 本发明实施例还提供了一种分布式事务的流程保障装置,如图5所示,包括:
[0148] 收发单元601,用于接收调用系统发送的处理请求;
[0149] 配置单元602,用于根据所述处理请求确定主流程以及N个子流程,N≥1;
[0150] 所述收发单元601,还用于针对所述N个子流程中的任一子流程,将所述子流程向对应的子系统发送,以使所述子系统对子流程进行处理;
[0151] 监控单元603,用于对N个子流程的处理过程进行监控,当任一子流程的处理过程出现异常时,根据异常类型、所述主流程的类型以及所述子流程的类型确定对应的异常处理策略;
[0152] 异常处理单元604,用于根据所述异常处理策略对子流程进行异常处理,所述异常处理包括对已经处理成功的子流程执行非对称反向操作,所述非对称反向操作为执行反向子流程,所述反向子流程与所述已经处理的子流程非对称。
[0153] 可选的,所述N个子流程中包括异步子流程;所述收发单元601,还用于:
[0154] 针对所述异步子流程,以设置的频率向所述异步子流程对应的异步子系统发送结果查询请求,直至接收到所述异步子系统反馈的处理结果。
[0155] 可选的,所述异常处理单元604,用于:
[0156] 针对所述异步子流程,执行重试处理。
[0157] 可选的,所述监控单元603,用于对所述主流程以及每个子流程的处理时间进行监控,若所述主流程和/或任一子流程的处理时间超过对应的时间阈值,则确定出现超时类异常;
[0158] 所述异常处理单元604,用于针对异步子流程出现超时类异常,则对所述异步子流程执行重试处理;针对主流程和/或同步子流程出现超时类异常,向所述调用系统反馈处理过程超时,并确定超时子流程的处理状态;若所述超时子流程的处理状态明确,则对已处理成功的子流程执行非对称反向操作;若所述超时子流程的处理状态不明确,则对所述主流程转批量异步处理。
[0159] 可选的,所述异常处理单元604,用于:
[0160] 间隔预定时间段后,向所述超时子流程对应的子系统发送结果查询请求;
[0161] 若接收到所述子系统发送的处理成功结果,则对所述超时子流程以及所述超时子流程之前的子流程执行非对称反向操作;
[0162] 若接收到所述子系统发送的处理失败结果,则对所述超时子流程之前的子流程执行非对称反向操作;
[0163] 若接收到所述子系统发送的处理结果不明确反馈,则执行所述间隔预定时间段后,向所述超时子流程对应的子系统发送结果查询请求的步骤。
[0164] 可选的,所述收发单元601,用于:
[0165] 统计接收到的处理请求的数量;
[0166] 若所述处理请求的数量大于流量预警值,则向所述调用系统发送预警消息,并控制向所述调用系统反馈响应报文的时间。
[0167] 可选的,所述收发单元601,用于:
[0168] 接收子系统反馈的响应消息;
[0169] 将所述响应消息格式化,得到响应报文;
[0170] 将所述响应报文向所述调用系统发送。
[0171] 基于相同的原理,本发明还提供一种电子设备,如图6所示,包括:
[0172] 包括处理器701、存储器702、收发机703、总线接口704,其中处理器701、存储器702与收发机703之间通过总线接口704连接;
[0173] 所述处理器701,用于读取所述存储器702中的程序,执行下列方法:
[0174] 接收调用系统发送的处理请求;
[0175] 根据所述处理请求确定主流程以及N个子流程,N≥1;
[0176] 针对所述N个子流程中的任一子流程,将所述子流程向对应的子系统发送,以使所述子系统对子流程进行处理;
[0177] 对N个子流程的处理过程进行监控,当任一子流程的处理过程出现异常时,根据异常类型、主流程类型以及子流程类型确定对应的异常处理策略;
[0178] 根据所述异常处理策略对子流程进行异常处理,所述异常处理包括对已经处理成功的子流程执行非对称反向操作,所述非对称反向操作为执行反向子流程,所述反向子流程与所述已经处理的子流程非对称。
[0179] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0180] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0181] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0182] 尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0183] 显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。