分布式系统的事务处理方法、装置、系统、介质及设备与流程

专利2022-06-29  70


本公开涉及计算机技术领域,具体地,涉及一种分布式系统的事务处理方法、装置、系统、介质及设备。



背景技术:

随着分布式服务架构的流行与普及,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用,随之而来的挑战就是分布式事务问题。由于每个服务都使用其单独维护的数据库,因此在不同服务的远程调用时对数据的操作并不在同一个事务中,比如服务a调用服务b,服务a执行成功,服务b执行失败,此时由于服务a的事务已经提交,无法回滚,这就会导致数据不一致的问题。

现有技术中,在解决服务调用的数据不一致问题时,通常是基于tcc(tcc服务是由try/confirm/cancel业务构成的)、消息最终一致性事务等柔性事务的分布式事务,其中,tcc是基于补偿机制实现的,而消息最终一致事务中,在进行分布式系统的事务处理时,可能会出现服务调用者应用的服务调用请求消息多次重复发送,从而使得服务提供者应用存在同一消息被多次消费的风险。并且在网络中断或网络不稳定时,需要多次重发服务调用请求或确认消息以实现服务调用者应用和服务提供者应用的事务交互。



技术实现要素:

本公开的目的是提供一种安全、稳定地分布式系统的事务处理方法、装置、系统、介质及设备。

为了实现上述目的,根据本公开的第一方面,提供一种分布式系统的事务处理方法,所述方法包括:

拦截服务调用者应用发起的服务调用请求,其中,所述服务调用请求中包含请求调用的服务;

若所述服务调用请求中存在预设的一致性标识,根据所述请求调用的服务的方法元数据构建事件对象并存储所述事件对象至发布事件列表,其中,所述事件对象的初始状态为未发布;

从所述发布事件列表中状态为未发布的事件对象中选择目标对象,并将所述目标对象对应的请求消息发布至消息中间件,其中,所述请求消息中包括所述目标对象对应的目标服务的方法元数据,以使提供所述目标服务的服务提供者应用基于所述请求消息提供所述目标服务。

可选地,所述将所述目标对象对应的请求消息发布至消息中间件,包括:

将所述请求消息发布至消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中,以由所述服务提供者应用从所述消息队列中获取所述请求消息。

可选地,所述服务调用者应用初始化有发布锁;在所述从所述发布事件列表中状态为未发布的事件对象中选择目标对象的步骤之前,所述方法还包括:

确定所述发布锁的状态;

若所述发布锁的状态为空闲状态,将所述发布锁的状态更新为使用状态,并执行所述从所述发布事件列表中状态为未发布的事件对象中选择目标对象的步骤;

在所述将所述目标对象对应的请求消息发布至消息中间件的步骤之后,所述方法还包括:

将所述发布锁的状态更新为空闲状态。

根据本公开的第二方面,提供一种分布式系统的事务处理方法,应用于服务提供者应用,所述方法包括:

从消息中间件获取请求消息,其中,所述请求消息中包括服务的方法元数据;

根据所述服务的方法元数据构建事件对象并存储所述事件对象至处理事件列表中,其中,所述事件对象的初始状态为未处理;

从所述处理事件列表中状态为未处理的事件对象中选择目标对象,并根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法,以为发起所述目标对象对应的请求消息的服务调用者应用提供所述目标服务。

可选地,所述从消息中间件获取请求消息,包括:

从所述消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中获取所述请求消息。

可选地,所述服务提供者应用初始化有处理锁;在所述从所述处理事件列表中状态为未处理的事件对象中选择目标对象的步骤之前,所述方法还包括:

确定所述处理锁的状态;

在所述处理锁的状态为空闲状态时,将所述处理锁的状态更新为使用状态,并执行从所述处理事件列表中状态为未处理的事件对象中选择目标对象的步骤;

在所述根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法的步骤之后,所述方法还包括:

将所述处理锁的状态更新为空闲状态。

根据本公开的第三方面,提供一种分布式系统的事务处理装置,所述装置包括:

拦截模块,用于拦截服务调用者应用发起的服务调用请求,其中,所述服务调用请求中包含请求调用的服务;

第一存储模块,用于在所述服务调用请求中存在预设的一致性标识的情况下,根据所述请求调用的服务的方法元数据构建事件对象并存储所述事件对象至发布事件列表,其中,所述事件对象的初始状态为未发布;

发布模块,用于从所述发布事件列表中状态为未发布的事件对象中选择目标对象,并将所述目标对象对应的请求消息发布至消息中间件,其中,所述请求消息中包括所述目标对象对应的目标服务的方法元数据,以使提供所述目标服务的服务提供者应用基于所述请求消息提供所述目标服务。

可选地,所述发布模块包括:

将所述请求消息发布至消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中,以由所述服务提供者应用从所述消息队列中获取所述请求消息。

可选地,所述服务调用者应用初始化有发布锁;所述装置还包括:

第一确定模块,用于在所述发布模块从所述发布事件列表中状态为未发布的事件对象中选择目标对象之前,确定所述发布锁的状态;

第一更新模块,用于在所述发布锁的状态为空闲状态的情况下,将所述发布锁的状态更新为使用状态,并触发所述发布模块从所述发布事件列表中状态为未发布的事件对象中选择目标对象;

所述装置还包括:

第二更新模块,用于在所述发布模块将所述目标对象对应的请求消息发布至消息中间件之后,将所述发布锁的状态更新为空闲状态。

根据本公开的第四方面,提供一种分布式系统的事务处理装置,应用于服务提供者应用,所述装置包括:

获取模块,用于从消息中间件获取请求消息,其中,所述请求消息中包括服务的方法元数据;

第二存储模块,用于根据所述服务的方法元数据构建事件对象并存储所述事件对象至处理事件列表中,其中,所述事件对象的初始状态为未处理;

执行模块,用于从所述处理事件列表中状态为未处理的事件对象中选择目标对象,并根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法,以为发起所述目标对象对应的请求消息的服务调用者应用提供所述目标服务。

可选地,所述获取模块包括:

从所述消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中获取所述请求消息。

可选地,所述服务提供者应用初始化有处理锁;所述装置还包括:

第二确定模块,用于在所述执行模块从所述处理事件列表中状态为未处理的事件对象中选择目标对象之前,确定所述处理锁的状态;

第三更新模块,用于在所述处理锁的状态为空闲状态时,将所述处理锁的状态更新为使用状态,并触发所述执行模块从所述处理事件列表中状态为未处理的事件对象中选择目标对象;

所述装置还包括:

第四更新模块,用于在所述执行模块根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法之后,将所述处理锁的状态更新为空闲状态。

根据本公开的第五方面,提供一种分布式系统的事务处理系统,所述系统包括:

消息发布组件,所述消息发布组件与服务调用者应用耦合,所述消息发布组件用于执行上述第一方面任一所述方法的步骤;

消息中间件,用于对请求消息进行存储;

服务提供者应用,所述服务提供者应用用于执行上述第二方面任一所述方法的步骤。

根据本公开的第六方面,提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述第一方面和第二方面任一所述方法的步骤。

根据本公开的第七方面,提供一种电子设备,包括:

存储器,其上存储有计算机程序;

处理器,用于执行所述存储器中的所述计算机程序,以实现上述第一方面和第二方面任一所述方法的步骤。

在上述技术方案中,拦截服务调用者应用发起的服务调用请求,若该服务调用请求中存在预设的一致性标识,则可以根据请求调用的服务的方法元数据构建事件对象并将事件对象存储至发布事件列表中。因此,在发布服务调用请求对应的请求消息时,并不是直接基于该服务调用请求进行发布,而是从本地发布事件列表中状态为未发布的事件对象中选择目标对象,从而将目标对象对应的请求消息发布至消息中间件,实现服务调用请求对应的请求消息发布。通过上述技术方案,基于发布事件列表对服务调用请求对应的请求消息进行发布,可以将远程服务调用请求转换为本地消息发布,从而在分布式事务处理过程中,可以有效避免由于网络中断、事务异常等原因而导致的服务调用者应用多次发起服务调用请求的问题,既可以避免重复发起服务调用请求造成的资源浪费,同时也可以保证服务调用请求对应的请求消息能够发布至消息中间件,进而保证事务最终一致性,提高分布式系统的事务处理稳定性和安全性。另外,在上述技术方案中,通过拦截服务调用请求,并确定服务调用请求中是否存在预设的一致性标识的方式,也可以有效降低实现事务最终一致性时对微服务应用的侵入性,从而可以降低分布式系统的事务处理的复杂性,并进一步提高事务处理的安全性和健壮性。

本公开的其他特征和优点将在随后的具体实施方式部分予以详细说明。

附图说明

附图是用来提供对本公开的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本公开,但并不构成对本公开的限制。在附图中:

图1是根据本公开的一种实施方式提供的分布式系统的事务处理方法的流程图。

图2是根据本公开的一种实施方式提供的分布式系统的事务处理方法的流程图;

图3是根据本公开的一种实施方式提供的分布式系统的事务处理装置的框图;

图4是根据本公开的一种实施方式提供的分布式系统的事务处理装置的框图;

图5是根据一示例性实施例示出的一种电子设备的框图;

图6是根据一示例性实施例示出的一种电子设备的框图。

具体实施方式

以下结合附图对本公开的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本公开,并不用于限制本公开。

在分布式服务架构中需要保证事务处理过程中的数据一致性。而在微服务应用间进行异步调用时,部分微服务的调用只需要保证事务最终一致性即可,其中,事务最终一致性是指系统中所有数据副本经过一定时间后,最终能够达到一致的状态。例如,在不要求实时性的场景下,例如用户a在对用户b转账x,在用户a的账户扣费x之后,保证用户b的账户中最终可以入账x,从而保证数据的一致性,即实现该转账事务最终一致性。

基于此,本公开提供一种分布式系统的事务处理系统,所述系统包括:

消息发布组件,所述消息发布组件与服务调用者应用耦合,所述消息发布组件用于发布服务调用请求对应的请求消息;

消息中间件,用于对请求消息进行存储;

服务提供者应用,所述服务提供者应用用于对请求消息进行处理,以提供相应的服务。

以下,对本方案的具体实施方式进行详细说明。

本公开提供一种分布式系统的事务处理方法。图1所示,为根据本公开的一种实施方式提供的分布式系统的事务处理方法的流程图,该方法可以应用于与服务调用者应用耦合的消息发布组件,该消息发布组件可以独立于该服务调用者应用,也可以集成在该服务调用者应用中,如图1所示,所述方法包括:

在s11中,拦截服务调用者应用发起的服务调用请求,其中,所述服务调用请求中包含请求调用的服务。

其中,服务调用者应用可以为一微服务应用,各个微服务应用之间可以进行远程调用。示例地,若微服务应用a调用微服务应用b,则该服务调用请求中则可以包含该微服务应用b对应的标识信息,该标识信息可以是该微服务应用b的应用名称。例如,在为用户发放代金券的应用场景中,可以通过用户服务调用代金券服务实现,则用户服务可以发送包括代金券服务的应用名称的服务调用请求,以调用该代金券服务。可选地,拦截服务调用者应用发起的服务调用请求可以通过拦截器实现,在用户服务发起该服务调用请求时,可以通过该拦截器对该服务调用请求进行拦截。示例地,在dubbo服务框架中可以采用拦截器(filter)进行拦截,对于springcloud服务框架而言,可以在feign的拦截器中进行拦截。其中,dubbo服务框架、springcloud服务框架中进行拦截的方式均为现有技术,在此不再赘述。

在s12中,若服务调用请求中存在预设的一致性标识,根据请求调用的服务的方法元数据构建事件对象并存储事件对象至发布事件列表,其中,所述事件对象的初始状态为未发布。

其中,针对需要保证事务最终一致性的调用服务,可以在调用远程服务时的接口中添加预设的一致性标识,示例地,该一致性标识可以是注解,该注解用于表示在调用该服务时,需要保证事务最终一致性。其中,预设的一致性标识可以根据实际使用场景进行设置和添加。

示例地,拦截到的服务调用请求如下:

即,在上述服务调用请求中,请求调用的服务为sayhi,testserverblo为调用该服务sayhi的接口。通过拦截该服务调用请求,确定在该服务调用请求中存在一致性标识,即注解@basetransaction,该注解为用于表示在调用该服务时需要保证事务最终一致性的注解,即此时可以确定在基于该服务调用请求对该服务进行调用时,需要保证事务最终一致性。

示例地,服务的方法元数据可以包括服务的方法的签名,方法的参数,以及参数的描述等,根据请求调用的服务的方法元数据构建事件对象可以是将该请求调用的服务的方法元数据按照事件对象(event对象)对应的结构进行结构化处理,从而构建事件对象,并将该事件对象存储至发布事件列表,便于对该请求调用的服务的方法元数据进行统一管理。需要说明的是,该服务调用者应用可以对应有多个服务实例,该多个服务实例处于同一数据库,该发布事件列表存储在该数据库中,多个服务实例共享该发布事件列表。

在s13中,从发布事件列表中状态为未发布的事件对象中选择目标对象,并将目标对象对应的请求消息发布至消息中间件,其中,所述请求消息中包括所述目标对象对应的目标服务的方法元数据,以使提供所述目标服务的服务提供者应用基于所述请求消息提供所述目标服务。

其中,发布事件列表中可以存在多个状态为未发布的事件对象,在选择目标对象时,可以将该发布事件列表中的全部状态为未发布的事件对象作为目标对象,也可以将该发布事件列表中状态为未发布的事件对象按照创建时间由早至晚的顺序排序在前n的事件对象作为目标对象,其中,n可以根据实际使用场景进行设置。

示例地,可以通过定时轮询的方式选择目标对象,示例地,可以每隔2s执行从发布事件列表中状态为未发布的事件对象中选择目标对象的步骤。并且,基于本地的发布事件列表中的事件对象进行请求消息的发布,可以使得存储在发布事件列表中的状态为未发布的事件对象所对应的请求消息最终都可以被发布出去,保证数据处理的可靠性。

在上述技术方案中,拦截服务调用者应用发起的服务调用请求,若该服务调用请求中存在预设的一致性标识,则可以根据请求调用的服务的方法元数据构建事件对象并将事件对象存储至发布事件列表中。因此,在发布服务调用请求对应的请求消息时,并不是直接基于该服务调用请求进行发布,而是从本地发布事件列表中状态为未发布的事件对象中选择目标对象,从而将目标对象对应的请求消息发布至消息中间件,实现服务调用请求对应的请求消息发布。通过上述技术方案,基于发布事件列表对服务调用请求对应的请求消息进行发布,可以将远程服务调用请求转换为本地消息发布,从而在分布式事务处理过程中,可以有效避免由于网络中断、事务异常等原因而导致的服务调用者应用多次发起服务调用请求的问题,既可以避免重复发起服务调用请求造成的资源浪费,同时也可以保证服务调用请求对应的请求消息能够发布至消息中间件,进而保证事务最终一致性,提高分布式系统的事务处理稳定性和安全性。另外,在上述技术方案中,通过拦截服务调用请求,并确定服务调用请求中是否存在预设的一致性标识的方式,也可以有效降低实现事务最终一致性时对微服务应用的侵入性,从而可以降低分布式系统的事务处理的复杂性,并进一步提高事务处理的安全性和健壮性。

本公开还提供一种分布式系统的事务处理方法,应用于服务提供者应用,如图2所示,所述方法包括:

在s21中,从消息中间件获取请求消息,其中,所述请求消息中包括服务的方法元数据。因此,该服务提供者应用通过获取请求消息,可以获得该服务的方法元数据。示例地,该消息中间件可以是mq消息队列,则服务提供者应用可以从该消息中间件中订阅消息,从而获取该请求消息。

在s22中,根据服务的方法元数据构建事件对象并存储事件对象至处理事件列表中,其中,所述事件对象的初始状态为未处理。

其中,根据服务的方法元数据构建事件对象的方式已在上文进行详述,在此不再赘述。示例地,该服务提供者应用为一微服务应用,该微服务应用对应有多个服务实例,且该多个服务实例处于同一数据库,该处理事件列表存储在该数据库中,多个服务实例共享该处理事件列表。

在s23中,从处理事件列表中状态为未处理的事件对象中选择目标对象,并根据目标对象对应的目标服务的方法元数据,执行目标服务的方法,以为发起目标对象对应的请求消息的服务调用者应用提供目标服务。

其中,处理事件列表中可以存在多个状态为未处理的事件对象,在选择目标对象时,可以将该处理事件列表中的全部状态为未处理的事件对象作为目标对象,也可以将该处理事件列表中状态为未处理的事件对象按照创建时间由早至晚的顺序排序在前m的事件对象作为目标对象,其中,m可以根据实际使用场景进行设置。

同样,可以通过定时轮询的方式选择该目标对象,且基于本地的处理事件列表中的事件对象进行消息处理,从而可以保证处理事件列表中状态为未处理的事件对象最终都会被处理,保证事务最终一致性。

示例地,根据目标对象对应的目标服务的方法元数据,执行目标服务的方法,可以根据该方法元数据中的方法名称和参数反射调用的目标服务的方法。例如在上述为用户发放代金券的应用场景下,服务提供者应用可以为代金券服务,则代金券服务可以根据方法元数据,反射调用代金券服务的方法,从而执行该方法以为用户发放代金券。其中对方法进行发射调用为现有技术,在此不再赘述。

在上述技术方案中,根据从消息中间件中获取的请求消息构建事件对象,并将事件对象存储至处理事件列表中。因此,在对请求消息进行处理时,并不直接基于该请求消息进行处理,而是基于本地的处理事件列表中的选择的目标对象进行处理。由于目标对象是处理事件列表中的未处理的事件对象,由此可以避免对同一请求消息的重复处理,也可以保证处理事件中状态为未处理的事件对象可以最终被处理,保证事务最终一致性和可靠性。同时,基于本地事务进行请求消息处理,从而无需消息中间件进行消息重发,既可以避免多次发送请求消息造成的资源浪费,也可以避免同一消息被重复处理,提高分布式系统的事务处理稳定性和安全性。

可选地,所述将所述目标对象对应的请求消息发布至消息中间件的示例方式如下,该步骤可以包括:

将所述请求消息发布至消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中,以由所述服务提供者应用从所述消息队列中获取所述请求消息。

对应地,当该方法应用于服务提供者应用时,所述从消息中间件获取请求消息,包括:

从所述消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中获取所述请求消息。

其中,每个微服务应用在启动时,都可以在消息中间件中初始化一与该微服务应用的标识信息对应的消息队列和路由,其中,该微服务应用的标识信息可以是该微服务应用的应用名称。其中,每个微服务应用可以作为服务调用者应用的身份,也可以作为服务提供者应用的身份,其具体身份的确定可以根据实际服务调用场景确定。例如,微服务应用a调用微服务应用b,微服务应用b作为服务提供者应用;微服务应用b调用微服务应用c时,微服务应用b作为服务调用者应用。

示例地,标识信息为应用名称,在微服务应用a调用微服务应用b时,在发布调用微服务应用b对应的请求消息时,可以基于初始化的路由将该请求消息发布至消息中间件中与微服务应用b的应用名称对应的消息队列中。由此,在微服务应用b从消息中间件中订阅消息时,则可以直接以微服务应用b的应用名称获取请求消息,即直接从与微服务应用b的应用名称对应的消息队列获取请求消息。

通过上述技术方案,在分布式系统中进行服务调用时,可以直接将请求消息发送至消息中间件中与服务提供者应用的标识信息对应的消息队列中,一方面可以便于消息中间件中的消息管理,另一方面使得服务提供者应用可以快速且准确地获取其需要处理的请求消息,降低消息订阅的开销,同时可以提高请求消息的处理效率,在保证事务最终一致性的同时,提高事务最终一致性的处理效率。

可选地,在微服务应用初始化时,可以分别初始化一发布锁和一处理锁,其中,该发布锁用于保证在同一时刻发布事件列表的查询是唯一的,该处理锁用于保证在同一时刻处理事件列表的查询是唯一的。

示例地,所述服务调用者应用初始化有发布锁;在所述从所述发布事件列表中状态为未发布的事件对象中选择目标对象的步骤之前,所述方法还包括:

确定所述发布锁的状态,其中该发布锁初始状态为空闲状态;

若所述发布锁的状态为空闲状态,将所述发布锁的状态更新为使用状态,并执行所述从所述发布事件列表中状态为未发布的事件对象中选择目标对象的步骤。

在所述将所述目标对象对应的请求消息发布至消息中间件的步骤之后,所述方法还包括:

将所述发布锁的状态更新为空闲状态。

在该技术方案中,在服务调用者应用将请求消息发布至消息中间件中时,需要保证每个请求消息都需要进行发布,并且每个请求消息在消息中间件上唯一。基于此,为了保证分布式系统的高效率和吞吐量,在本公开中为微服务应用初始化一发布锁,使得服务调用者应用在发布请求消息时,对发布事件列表的查询是唯一的,从而保证请求消息发布的唯一性。在从所述发布事件列表中状态为未发布的事件对象中选择目标对象之前,通过确定发布锁的状态可以确定微服务应用中当前是否有服务实例正在查询该发布事件列表,若发布锁的状态处于空闲状态,则表示当前没有服务实例查询发布事件列表,此时可以执行从所述发布事件列表中状态为未发布的事件对象中选择目标对象的步骤;若发布锁的状态处于使用状态,则表示当前有服务实例查询发布事件列表,此时需要等待发布锁的状态更新为空闲状态之后,才可允许查询发布事件列表。

在上述技术方案中,服务调用者应用初始化有发布锁,在发布锁的状态为空闲状态时,才能够查询发布事件列表,并从发布事件列表中状态为未发布的事件对象中选择目标对象,从而将目标对象对应的请求消息发布至消息中间件。通过上述技术方案,通过该发布锁可以保证同一时刻对发布事件列表的查询是唯一的,并且该发布锁为与微服务应用对应的应用锁,即不会对数据库资源(如,发布事件列表)进行加锁,从而可以在保证数据库资源的一致性的同时,有效提高分布式系统高并发的性能需求,有效降低锁冲突,提高系统吞吐量。

可选地,所述方法还包括:

若确定目标对象对应的请求消息成功发布至消息中间件中,将发布事件列表该目标对象的状态更新为已发布,从而可以避免对已经成功发布的请求消息的重复发布。

作为示例,可以通过消息中间件反馈消息的方式确定目标对象对应的请求消息是否成功发布至消息中间件,在接收到消息中间件的反馈消息时,确定与该反馈消息对应的请求消息成功发布至消息中间件中。

可选地,当该方法应用于服务提供者应用时,所述服务提供者应用初始化有处理锁;在所述从所述处理事件列表中状态为未处理的事件对象中选择目标对象的步骤之前,所述方法还包括:

确定所述处理锁的状态;

在所述处理锁的状态为空闲状态时,将所述处理锁的状态更新为使用状态,并执行从所述处理事件列表中状态为未处理的事件对象中选择目标对象的步骤;

在所述根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法的步骤之后,所述方法还包括:

将所述处理锁的状态更新为空闲状态。

在该技术方案中,在服务提供者应用可以根据目标对象对应的目标服务的方法元数据,执行目标服务,从而对目标对象对应的请求消息进行处理。在该过程中,需要保证该请求消息只能够被成功处理一次。基于此,为了避免请求消息被重复处理,在本公开中为微服务应用初始化一处理锁,使得服务提供者应用在根据目标对象对应的目标服务的方法元数据,执行目标服务的方法时,只由其一个服务实例进行处理。

示例地,在从所述处理事件列表中状态为未处理的事件对象中选择目标对象之前,通过确定处理锁的状态可以确定微服务应用中当前是否有其他服务实例正在查询该处理事件列表,若处理锁的状态处于空闲状态,则表示当前没有服务实例查询处理事件列表,此时可以执行从所述处理事件列表中状态为未处理的事件对象中选择目标对象的步骤;若处理锁的状态处于使用状态,则表示当前有服务实例查询处理事件列表,为了避免请求消息的重复处理,则需要等待处理锁的状态更新为空闲状态之后,才可允许查询处理事件列表。

在上述技术方案中,服务调用者应用初始化有处理锁,在处理锁的状态为空闲状态时,才能够查询处理事件列表,并从处理事件列表中状态为未处理的事件对象中选择目标对象,从而根据目标对象对应的目标服务的方法元数据执行目标服务的方法。通过上述技术方案,通过该处理锁可以保证同一时刻对处理事件列表的查询是唯一的,从而可以有效避免对请求消息的重复处理,并且可以保证处理事件列表中的目标对象对应的请求消息可以被处理,从而可以保证分布式系统的事务处理的最终一致性。并且该处理锁为与微服务应用对应的应用锁,即不会对数据库中的处理事件列表资源进行加锁,提高事务处理的并发性,保证分布式系统的稳定运行。

可选地,所述方法还包括:

若确定目标服务的方法执行完成,将处理事件列表该目标对象的状态更新为已发布,可以避免对已经执行完成的请求消息的重复执行,保证事务处理一致性。同时,也可以基于发布事件列表和处理事件列表对请求消息的处理状态进行维护和记录,便于回溯。

本公开还提供一种分布式系统的事务处理装置,如图3所示,所述装置10包括:

拦截模块101,用于拦截服务调用者应用发起的服务调用请求,其中,所述服务调用请求中包含请求调用的服务;

第一存储模块102,用于在所述服务调用请求中存在预设的一致性标识的情况下,根据所述请求调用的服务的方法元数据构建事件对象并存储所述事件对象至发布事件列表,其中,所述事件对象的初始状态为未发布;

发布模块103,用于从所述发布事件列表中状态为未发布的事件对象中选择目标对象,并将所述目标对象对应的请求消息发布至消息中间件,其中,所述请求消息中包括所述目标对象对应的目标服务的方法元数据,以使提供所述目标服务的服务提供者应用基于所述请求消息提供所述目标服务。

可选地,所述发布模块包括:

将所述请求消息发布至消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中,以由所述服务提供者应用从所述消息队列中获取所述请求消息。

可选地,所述服务调用者应用初始化有发布锁;所述装置还包括:

第一确定模块,用于在所述发布模块从所述发布事件列表中状态为未发布的事件对象中选择目标对象之前,确定所述发布锁的状态;

第一更新模块,用于在所述发布锁的状态为空闲状态的情况下,将所述发布锁的状态更新为使用状态,并触发所述发布模块从所述发布事件列表中状态为未发布的事件对象中选择目标对象;

所述装置还包括:

第二更新模块,用于在所述发布模块将所述目标对象对应的请求消息发布至消息中间件之后,将所述发布锁的状态更新为空闲状态。

本公开还提供一种分布式系统的事务处理装置,应用于服务提供者应用,如图4所示,所述装置20包括:

获取模块201,用于从消息中间件获取请求消息,其中,所述请求消息中包括服务的方法元数据;

第二存储模块202,用于根据所述服务的方法元数据构建事件对象并存储所述事件对象至处理事件列表中,其中,所述事件对象的初始状态为未处理;

执行模块203,用于从所述处理事件列表中状态为未处理的事件对象中选择目标对象,并根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法,以为发起所述目标对象对应的请求消息的服务调用者应用提供所述目标服务。

可选地,所述获取模块包括:

从所述消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中获取所述请求消息。

可选地,所述服务提供者应用初始化有处理锁;所述装置还包括:

第二确定模块,用于在所述执行模块从所述处理事件列表中状态为未处理的事件对象中选择目标对象之前,确定所述处理锁的状态;

第三更新模块,用于在所述处理锁的状态为空闲状态时,将所述处理锁的状态更新为使用状态,并触发所述执行模块从所述处理事件列表中状态为未处理的事件对象中选择目标对象;

所述装置还包括:

第四更新模块,用于在所述执行模块根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法之后,将所述处理锁的状态更新为空闲状态。

关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

图5是根据一示例性实施例示出的一种电子设备700的框图。如图5所示,该电子设备700可以包括:处理器701,存储器702。该电子设备700还可以包括多媒体组件703,输入/输出(i/o)接口704,以及通信组件705中的一者或多者。

其中,处理器701用于控制该电子设备700的整体操作,以完成上述的分布式系统的事务处理方法中的全部或部分步骤。存储器702用于存储各种类型的数据以支持在该电子设备700的操作,这些数据例如可以包括用于在该电子设备700上操作的任何应用程序或方法的指令,以及应用程序相关的数据,例如联系人数据、收发的消息、图片、音频、视频等等。该存储器702可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,例如静态随机存取存储器(staticrandomaccessmemory,简称sram),电可擦除可编程只读存储器(electricallyerasableprogrammableread-onlymemory,简称eeprom),可擦除可编程只读存储器(erasableprogrammableread-onlymemory,简称eprom),可编程只读存储器(programmableread-onlymemory,简称prom),只读存储器(read-onlymemory,简称rom),磁存储器,快闪存储器,磁盘或光盘。多媒体组件703可以包括屏幕和音频组件。其中屏幕例如可以是触摸屏,音频组件用于输出和/或输入音频信号。例如,音频组件可以包括一个麦克风,麦克风用于接收外部音频信号。所接收的音频信号可以被进一步存储在存储器702或通过通信组件705发送。音频组件还包括至少一个扬声器,用于输出音频信号。i/o接口704为处理器701和其他接口模块之间提供接口,上述其他接口模块可以是键盘,鼠标,按钮等。这些按钮可以是虚拟按钮或者实体按钮。通信组件705用于该电子设备700与其他设备之间进行有线或无线通信。无线通信,例如wi-fi,蓝牙,近场通信(nearfieldcommunication,简称nfc),2g、3g、4g、nb-iot、emtc、或其他5g等等,或它们中的一种或几种的组合,在此不做限定。因此相应的该通信组件705可以包括:wi-fi模块,蓝牙模块,nfc模块等等。

在一示例性实施例中,电子设备700可以被一个或多个应用专用集成电路(applicationspecificintegratedcircuit,简称asic)、数字信号处理器(digitalsignalprocessor,简称dsp)、数字信号处理设备(digitalsignalprocessingdevice,简称dspd)、可编程逻辑器件(programmablelogicdevice,简称pld)、现场可编程门阵列(fieldprogrammablegatearray,简称fpga)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述的分布式系统的事务处理方法。

在另一示例性实施例中,还提供了一种包括程序指令的计算机可读存储介质,该程序指令被处理器执行时实现上述的分布式系统的事务处理方法的步骤。例如,该计算机可读存储介质可以为上述包括程序指令的存储器702,上述程序指令可由电子设备700的处理器701执行以完成上述的分布式系统的事务处理方法。

图6是根据一示例性实施例示出的一种电子设备1900的框图。例如,电子设备1900可以被提供为一服务器。参照图6,电子设备1900包括处理器1922,其数量可以为一个或多个,以及存储器1932,用于存储可由处理器1922执行的计算机程序。存储器1932中存储的计算机程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理器1922可以被配置为执行该计算机程序,以执行上述的分布式系统的事务处理方法。

另外,电子设备1900还可以包括电源组件1926和通信组件1950,该电源组件1926可以被配置为执行电子设备1900的电源管理,该通信组件1950可以被配置为实现电子设备1900的通信,例如,有线或无线通信。此外,该电子设备1900还可以包括输入/输出(i/o)接口1958。电子设备1900可以操作基于存储在存储器1932的操作系统,例如windowsservertm,macosxtm,unixtm,linuxtm等等。

在另一示例性实施例中,还提供了一种包括程序指令的计算机可读存储介质,该程序指令被处理器执行时实现上述的分布式系统的事务处理方法的步骤。例如,该计算机可读存储介质可以为上述包括程序指令的存储器1932,上述程序指令可由电子设备1900的处理器1922执行以完成上述的分布式系统的事务处理方法。

在另一示例性实施例中,还提供一种计算机程序产品,该计算机程序产品包含能够由可编程的装置执行的计算机程序,该计算机程序具有当由该可编程的装置执行时用于执行上述的分布式系统的事务处理方法的代码部分。

以上结合附图详细描述了本公开的优选实施方式,但是,本公开并不限于上述实施方式中的具体细节,在本公开的技术构思范围内,可以对本公开的技术方案进行多种简单变型,这些简单变型均属于本公开的保护范围。例如。

另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合。为了避免不必要的重复,本公开对各种可能的组合方式不再另行说明。

此外,本公开的各种不同的实施方式之间也可以进行任意组合,只要其不违背本公开的思想,其同样应当视为本公开所公开的内容。


技术特征:

1.一种分布式系统的事务处理方法,其特征在于,所述方法包括:

拦截服务调用者应用发起的服务调用请求,其中,所述服务调用请求中包含请求调用的服务;

若所述服务调用请求中存在预设的一致性标识,根据所述请求调用的服务的方法元数据构建事件对象并存储所述事件对象至发布事件列表,其中,所述事件对象的初始状态为未发布;

从所述发布事件列表中状态为未发布的事件对象中选择目标对象,并将所述目标对象对应的请求消息发布至消息中间件,其中,所述请求消息中包括所述目标对象对应的目标服务的方法元数据,以使提供所述目标服务的服务提供者应用基于所述请求消息提供所述目标服务。

2.根据权利要求1所述的方法,其特征在于,所述将所述目标对象对应的请求消息发布至消息中间件,包括:

将所述请求消息发布至消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中,以由所述服务提供者应用从所述消息队列中获取所述请求消息。

3.根据权利要求1所述的方法,其特征在在于,所述服务调用者应用初始化有发布锁;在所述从所述发布事件列表中状态为未发布的事件对象中选择目标对象的步骤之前,所述方法还包括:

确定所述发布锁的状态;

若所述发布锁的状态为空闲状态,将所述发布锁的状态更新为使用状态,并执行所述从所述发布事件列表中状态为未发布的事件对象中选择目标对象的步骤;

在所述将所述目标对象对应的请求消息发布至消息中间件的步骤之后,所述方法还包括:

将所述发布锁的状态更新为空闲状态。

4.一种分布式系统的事务处理方法,其特征在于,应用于服务提供者应用,所述方法包括:

从消息中间件获取请求消息,其中,所述请求消息中包括服务的方法元数据;

根据所述服务的方法元数据构建事件对象并存储所述事件对象至处理事件列表中,其中,所述事件对象的初始状态为未处理;

从所述处理事件列表中状态为未处理的事件对象中选择目标对象,并根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法,以为发起所述目标对象对应的请求消息的服务调用者应用提供所述目标服务。

5.根据权利要求4所述的方法,其特征在于,所述从消息中间件获取请求消息,包括:

从所述消息中间件中、与所述服务提供者应用的标识信息对应的消息队列中获取所述请求消息。

6.一种分布式系统的事务处理装置,其特征在于,所述装置包括:

拦截模块,用于拦截服务调用者应用发起的服务调用请求,其中,所述服务调用请求中包含请求调用的服务;

第一存储模块,用于在所述服务调用请求中存在预设的一致性标识的情况下,根据所述请求调用的服务的方法元数据构建事件对象并存储所述事件对象至发布事件列表,其中,所述事件对象的初始状态为未发布;

发布模块,用于从所述发布事件列表中状态为未发布的事件对象中选择目标对象,并将所述目标对象对应的请求消息发布至消息中间件,其中,所述请求消息中包括所述目标对象对应的目标服务的方法元数据,以使提供所述目标服务的服务提供者应用基于所述请求消息提供所述目标服务。

7.一种分布式系统的事务处理装置,其特征在于,应用于服务提供者应用,所述装置包括:

获取模块,用于从消息中间件获取请求消息,其中,所述请求消息中包括服务的方法元数据;

第二存储模块,用于根据所述服务的方法元数据构建事件对象并存储所述事件对象至处理事件列表中,其中,所述事件对象的初始状态为未处理;

执行模块,用于从所述处理事件列表中状态为未处理的事件对象中选择目标对象,并根据所述目标对象对应的目标服务的方法元数据,执行所述目标服务的方法,以为发起所述目标对象对应的请求消息的服务调用者应用提供所述目标服务。

8.一种分布式系统的事务处理系统,其特征在于,所述系统包括:

消息发布组件,所述消息发布组件与服务调用者应用耦合,所述消息发布组件用于执行权利要求1-3中任一项所述方法的步骤;

消息中间件,用于对请求消息进行存储;

服务提供者应用,所述服务提供者应用用于执行权利要求4或5所述方法的步骤。

9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-5中任一项所述方法的步骤。

10.一种电子设备,其特征在于,包括:

存储器,其上存储有计算机程序;

处理器,用于执行所述存储器中的所述计算机程序,以实现权利要求1-5中任一项所述方法的步骤。

技术总结
本公开涉及一种分布式系统的事务处理方法、装置、系统、介质及设备,所述方法包括:拦截服务调用者应用发起的服务调用请求,其中,服务调用请求中包含请求调用的服务;若所述服务调用请求中存在预设的一致性标识,根据所述请求调用的服务的方法元数据构建事件对象并存储所述事件对象至发布事件列表,其中,所述事件对象的初始状态为未发布;从所述发布事件列表中状态为未发布的事件对象中选择目标对象,并将所述目标对象对应的请求消息发布至消息中间件,所述请求消息中包括所述目标对象对应的目标服务的方法元数据,以使提供所述目标服务的服务提供者应用基于所述请求消息提供所述目标服务。由此,可以保证分布式系统的事务处理最终一致性。

技术研发人员:陆国际;张霞;葛东;贾璐;邢铁军
受保护的技术使用者:东软集团股份有限公司
技术研发日:2019.12.05
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-28208.html

最新回复(0)