一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种全局事务协同方法、装置、设备及介质与流程

2022-02-22 01:56:20 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,尤其涉及一种全局事务协同方法、装置、设备以及计算机可读存储介质。


背景技术:

2.传统单体应用在业务增长时往往难以快速响应业务诉求,为此可以对单体应用进行服务化改造。然而,单体应用服务化后,数据库事务(transaction)共享成为大问题。所谓数据库事务是指访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。数据库事务由事务开始与事务结束之间执行的全部数据库操作组成。
3.目前,业界的传统做法是对业务进行垂直拆分,实现业务逻辑重构,避免数据库处理时引用相同资源的中间事务问题。具体地,将业务拆分为多个服务后,可以通过全局事务协调器,实现服务间协同分段事务、协同提交事务。例如,全局事务协调器启动全局事务,然后try服务a,以及try服务b,即分别为服务a、服务b预留对应的业务资源,接着可以同时confirm服务a和服务b,或者同时取消服务a和服务b,保障了事务一致性。
4.然而这种方法要求各服务分段拆分和提交,并且无法相互引用彼此未生效的业务数据。如此,增加了单体应用拆分微服务的难度,难以实现服务化部署。


技术实现要素:

5.本技术提供了一种全局事务协同方法,该方法解决了相关技术中单体应用拆分的微服务无法引用未生效的业务数据,增加了单体应用拆分微服务的难度,难以实现服务化部署的问题。本技术还提供了上述方法对应的装置、设备、计算机可读存储介质以及计算机程序产品。
6.第一方面,本技术提供了一种全局事务协同方法。该方法利用与服务同进程部署的本地代理,代理来自于外部客户端的服务请求,实时接收外部关联业务的事务操作实现未生效事务的数据操作。
7.具体地,第一服务接收来自于客户端的第一服务请求,所述第一服务请求用于请求调用第一服务,然后第一服务调用第一本地代理创建第一本地事务,以及向第二服务发送第一远程服务请求,如此,第二服务可以调用第二本地代理创建第二本地事务。接着第一服务调用第一本地代理接收关联业务即第二服务的事务操作,将事务操作提交至第一本地事务执行,第一服务调用第一本地代理发送全局事务提交请求,以使所述第一本地代理提交所述第一本地事务,所述第二本地代理提交所述第二本地事务。
8.在该方法中,外部客户端调用第一服务,而第一服务远程调用第二服务时,第一服务还可以通过本地代理接收第二服务的事务操作,并将其提交至第一本地事务执行,由此实现第二服务引用第一服务未生效的业务数据。如此实现了支持事务内数据对第三方服务可见,对降低了单体应用拆分微服务的难度以及服务化部署的难度,实现服务平滑拆分。进
一步地,该方法还支持服务异构数据栈演进,以及细粒度地按需扩容或缩容
9.在一些可能的实现方式中,服务之间可以通过服务请求实现引用未生效的业务数据。具体地,在所述第一服务调用第一本地代理接收所述第二服务的事务操作之前,所述第一服务接收来自于所述第二服务调用所述第二本地代理的第二远程服务请求,所述第二远程服务请求用于远程调用所述第一服务,所述第二远程服务请求包括全局事务标识。
10.在一些可能的实现方式中,所述第一服务可以调用所述第一本地代理创建第一本地事务的事务代理,所述第一服务通过所述事务代理将所述事务操作提交至所述第一本地事务执行。
11.在一些可能的实现方式中,第二服务可以通过第二本地代理操作第一服务对应的资源,如数据库,从而实现引用第一服务未生效的业务数据。具体地,在所述第一服务调用第一本地代理接收所述第二服务的事务操作之前,所述第一服务调用所述第一本地代理接收所述第二服务调用所述第二本地代理对第二资源的变更登记信息。
12.在一些可能的实现方式中,服务通常具有多个副本,为此,所述第一服务调用所述第一本地代理查询所述第二服务对应的服务节点,以及调用第一本地代理开启全局事务,接着第一服务调用所述第一本地代理生成第一远程服务请求,所述第一远程服务请求携带全局事务标识,所述第一远程服务请求可以发送至第二服务对应的服务节点,以用于远程调用所述第二服务。
13.在一些可能的实现方式中,所述第一服务可以调用所述第一本地代理向集群事务管理器发送全局事务提交请求,以使所述集群事务管理器在各事务执行成功时向各本地事务对应的本地代理发送本地事务提交请求。
14.在一些可能的实现方式中,所述第一服务还可以调用所述第一本地代理在集群事务管理器注册,当所述第一本地代理处于正常状态时,所述第一服务响应于所述集群事务管理器发送的健康检查请求调用所述第一本地代理发送反馈。
15.在一些可能的实现方式中,当所述第一本地代理由异常状态恢复为正常状态时,所述第一服务可以调用所述第一本地代理重新在所述集群事务管理器注册,所述第一服务调用所述第一本地代理接收所述集群事务管理器的回滚请求,进行事务回滚。
16.第二方面,本技术提供了一种全局事务协同装置。所述装置包括:
17.通信模块,用于接收来自于客户端的第一服务请求,所述第一服务请求用于请求调用第一服务;
18.创建模块,用于调用第一本地代理创建第一本地事务;
19.所述通信模块,还用于调用所述第一本地代理向第二服务发送第一远程服务请求,以使所述第二服务调用第二本地代理创建第二本地事务;
20.所述通信模块,还用于调用所述第一本地代理接收所述第二服务的事务操作;
21.提交模块,用于调用所述第一本地代理将所述事务操作提交至所述第一本地事务执行;
22.所述通信模块,还用于调用所述第一代理发送全局事务提交请求,以使所述第一服务调用所述第一本地代理提交所述第一本地事务,所述第二服务调用所述第二本地代理提交所述第二本地事务。
23.在一些可能的实现方式中,所述通信模块还用于:
24.在调用第一本地代理接收所述第二服务的事务操作之前,接收来自于所述第二服务调用所述第二本地代理的第二远程服务请求,所述第二远程服务请求用于远程调用所述第一服务,所述第二远程服务请求包括全局事务标识。
25.在一些可能的实现方式中,所述创建模块还用于:
26.调用所述第一本地代理创建第一本地事务的事务代理;
27.所述提交模块具体用于:
28.通过所述事务代理将所述事务操作提交至所述第一本地事务执行。
29.在一些可能的实现方式中,所述通信模块还用于:
30.在所述第一服务调用第一本地代理接收所述第二服务的事务操作之前,调用所述第一本地代理接收所述第二服务调用所述第二本地代理对第二资源的变更登记信息。
31.在一些可能的实现方式中,所述装置还包括:
32.查询模块,用于调用所述第一本地代理查询所述第二服务对应的服务节点;
33.开启模块,用于调用所述第一本地代理开启全局事务;
34.生成模块,用于调用所述第一本地代理生成第一远程服务请求,所述第一远程服务请求携带全局事务标识,所述第一远程服务请求用于远程调用所述第二服务。
35.在一些可能的实现方式中,所述通信模块具体用于:
36.调用所述第一本地代理向集群事务管理器发送全局事务提交请求,以使所述集群事务管理器在各事务执行成功时向各本地事务对应的本地代理发送本地事务提交请求。
37.在一些可能的实现方式中,所述装置还包括:
38.注册模块,用于调用所述第一本地代理在集群事务管理器注册;
39.所述通信模块,用于当所述第一本地代理处于正常状态时,响应于所述集群事务管理器发送的健康检查请求调用所述第一本地代理发送反馈。
40.在一些可能的实现方式中,所述装置还包括回滚模块;
41.所述注册模块,还用于当所述第一本地代理由异常状态恢复为正常状态时,调用所述第一本地代理重新在所述集群事务管理器注册;
42.所述回滚模块,用于接收所述集群事务管理器的回滚请求,进行事务回滚。
43.第三方面,本技术提供一种设备,所述设备包括处理器和存储器。所述处理器、所述存储器进行相互的通信。所述处理器用于执行所述存储器中存储的指令,以使得设备执行如第一方面或第一方面的任一种实现方式所述的全局事务协同方法。
44.第四方面,本技术提供一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,所述指令指示设备执行上述第一方面或第一方面的任一种实现方式所述的全局事务协同方法。
45.第五方面,本技术提供了一种包含指令的计算机程序产品,当其在设备上运行时,使得设备执行上述第一方面或第一方面的任一种实现方式所述的全局事务协同方法。
46.本技术在上述各方面提供的实现方式的基础上,还可以进行进一步组合以提供更多实现方式。
附图说明
47.为了更清楚地说明本技术实施例的技术方法,下面将对实施例中所需使用的附图
作以简单地介绍。
48.图1为本技术实施例提供的一种全局事务协同方法的系统架构图;
49.图2为本技术实施例提供的一种全局事务协同方法的交互流程图;
50.图3为本技术实施例提供的一种全局事务协同方法的交互流程图;
51.图4为本技术实施例提供的一种全局事务协同方法的交互流程图;
52.图5为本技术实施例提供的一种全局事务协同方法的交互流程图;
53.图6为本技术实施例提供的一种全局事务协同方法的交互流程图;
54.图7为本技术实施例提供的一种全局事务协同方法的交互流程图;
55.图8为本技术实施例提供的一种应用拆分为微服务的示意图;
56.图9为本技术实施例提供的一种应用拆分为微服务的示意图;
57.图10为本技术实施例提供的一种全局事务协同装置的结构示意图;
58.图11为本技术实施例提供的一种设备的结构示意图。
具体实施方式
59.本技术实施例中的术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。
60.首先对本技术实施例中所涉及到的一些技术术语进行介绍。
61.单体应用是指不同功能模块集成在一个进程中的应用。单体应用通常只有一个包文件,如war包。单体应用易于开发,而且不依赖其他接口,因此单体接口也比较易于测试。此外,将单体应用的目录部署在运行环境即可实现单体应用部署,可见单体应用也易于部署。为此,供应链管理(supply chain management,scm)、企业资源计划(enterprise resource planning,erp)、客户关系管理(customer relationship management,crm)等办公系统常常采用单体应用。
62.单体应用的可扩展性相对较差,在业务增长时往往难以快速响应业务诉求。为此可以对单体应用进行服务化改造。服务化改造是指将单体应用的不同功能模块改造成独立的服务或者微服务,这些服务或微服务之间通过远程过程调用接口(remote procedure call,rpc)进行相互调用。
63.事务(transaction)具体是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。该程序执行单元可以是一个数据库操作序列,数据库操作系列中的操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部操作组成。
64.从资源管理角度,事务可以分为全局事务和本地事务。其中,全局事务是指由资源管理器协调和管理的事务。全局事务通常为跨数据库的分布式事务。本地事务是指资源管理器直接控制的事务,本地事务通常不具有分布式事务处理能力。
65.为了便于理解,下面结合具体示例对全局事务和本地事务进行示例说明。例如,在电子商店应用中,该应用可以包括订单系统和产品系统。订单系统使用订单数据库db_order,产品系统使用产品数据库db_product,在订单系统中只能保证订单相关操作的事务,在产品系统中只能保证产品相关操作的事务。当在订单系统中执行创建订单操作时,即
会产生一个创建订单的事务。该事务即为本地事务。当在订单系统中执行创建订单操作,在产品系统中执行扣减库存操作时,即会产生一个创建订单并扣减库存的事务。该事务即为全局事务。
66.基于此,在对单体应用进行服务化改造时,涉及两个或两个以上服务的调用对应的事务可以视为全局事务。例如,某一应用调用服务a时,服务a还需要调用服务b,此时即产生一个全局事务。
67.单体应用服务化后,数据库事务(transaction)共享成为大问题。业界的传统做法是对业务进行垂直拆分,实现业务逻辑重构,避免数据库处理时引用相同资源的中间事务问题。具体地,将业务拆分为多个服务后,可以通过全局事务协调器,实现服务间协同分段事务、协同提交事务。例如,全局事务协调器启动全局事务,然后try服务a,以及try服务b,即分别为服务a、服务b预留对应的业务资源,接着可以同时confirm服务a和服务b,或者同时取消服务a和服务b,保障了全局事务一致性。
68.然而这种方法要求各服务分段拆分和提交,并且无法相互引用彼此未生效的业务数据。如此,增加了单体应用拆分微服务的难度,难以实现服务化部署。
69.有鉴于此,本技术实施例提供了一种全局事务协同方法。该方法提供了一种本地代理的机制,即通过与服务同进程部署的本地代理去代理服务对外的资源操作请求和/或数据库操作请求,当服务通过rpc接口调用其他服务时,根据需要记录并挂起当前服务的业务进程,通过本地代理向上述其他服务发起远程服务请求,其他服务的本地代理可以创建对应的本地事务。调用侧的服务还可以接收被调用侧的服务的事务操作,将其提交到原本地事务执行。调用侧的服务还可以通过本地代理发送全局事务提交请求时,调用侧的服务和被调用侧的其他服务通过各自的本地代理提交各自的本地事务,如此实现对未生效的业务数据的引用。由此可以降低单体应用拆分微服务的难度,易于实现服务化部署。
70.为了便于描述,本技术将调用侧的服务称之为第一服务,被调用侧的服务称之为第二服务。第一服务对应的本地代理称之为第一本地代理,第二服务对应的本地代理称之为第二本地代理。
71.第一本地代理接收第一服务请求,所述第一服务请求用于请求调用第一服务,然后第一本地代理根据所述第一服务请求创建第一本地事务,以及向第二服务发送第一远程服务请求,以使所述第二服务对应的第二本地代理创建第二本地事务,第一本地代理发送全局事务提交请求,以使所述第一本地代理提交所述第一本地事务,所述第二本地代理提交所述第二本地事务。
72.为了便于理解,本技术还提供一具体示例件说明。在该示例中,第一本地代理创建的第一本地事务可以为新建数据表,在该数据表中写入数据,由于该事务并未提交,因此上述数据并未生效。第一服务通过第一本地代理调用外部服务,如第二服务时,第二服务可以通过第二本地代理创建第二本地事务,第二服务还可以调用第二本地代理触发针对第一本地事务中数据的事务操作,第一服务可以通过第一本地代理接收第二服务的事务操作,将该事务操作提交至第一本地事务执行,由此实现第二服务引用第一服务未生效的业务数据。在一些实现方式中,本地代理还可以和集群事务管理器进行交互,如此,集群事务管理器可以跟踪集群场景各服务的服务健康情况,集群中服务操作的调用关系和关联资源操作记录,并且协调整体事务的同步提交生效或者同步回滚。
73.参见图1所示的全局事务协同方法的系统架构图,如图1所示,系统中包括客户端(例如外部客户端)、服务以及与服务同进程部署的本地代理。进一步地,系统中还可以包括集群事务管理器。在相关技术中,外部客户端通常是通过向服务自身发起服务请求进行服务调用,如图1中原调用关系所示,本技术实施例中,外部客户端通过与服务同进程部署的本地代理进行服务调用,如调用远程服务接口、原本地事务接口,如此可以实现引用未生效的业务数据。
74.其中,本地代理用于代理服务对外的资源操作请求和/或数据库操作请求,根据需要记录并挂起当前业务进程,根据需要调用集群事务管理器和其他服务的本地代理实现关联业务办理,并且实时接收外部关联业务的事务操作实现未生效事务的数据操作。
75.集群事务管理器用于负责跟踪集群场景各服务的服务健康情况,每个事务在集中各服务的对应关系,集群中服务操作的调用关系和关联资源操作记录,并且协调整体事务的同步提交生效或者同步回滚。
76.其中,本地代理和服务同进程部署。服务可以部署在计算机集群中。计算机集群可以包括至少一台计算机设备,服务可以部署在上述至少一台计算机设备中,服务的本地代理具体是部署在运行有服务的计算机设备中。
77.接下来,结合方法流程图对本技术实施例提供的全局事务协同方法进行介绍。
78.参见图2所示的全局事务协同方法的流程图,该方法包括:
79.s202:第一服务接收来自于客户端的第一服务请求。
80.第一服务请求用于请求调用第一服务。外部客户端如外部应用或外部进程在有服务调用需求时,可以生成服务请求,并发送服务请求。例如,外部客户端对第一服务有调用需求时,生成第一服务请求,并发送该第一服务请求。第一服务接收上述第一服务请求。
81.第一服务请求至少包括第一服务的服务标识。在一些实现方式中,第一服务请求还可以包括第一服务的参数,该参数是指第一服务的调用参数。在一些示例中,第一服务的调用参数可以是第一服务的调用接口的输入参数和/或输出参数。
82.s204:第一服务调用第一本地代理创建第一本地事务。
83.第一本地事务具体为第一服务包括的事务操作形成的操作序列。其中,事务操作可以分为数据库操作和非数据库操作等操作类型。数据库操作是指对数据库进行增删查改(即增加、删除、查找和/或改正)的操作。非数据库操作是指除数据库操作以外的操作,例如告警操作等。
84.第一本地代理是第一服务在本地的代理,用于代理第一服务对外的操作请求,如数据库操作请求、资源操作请求等等。第一本地代理与第一服务部署在同一进程,第一本地代理和第一服务可以视为同一进程的不同组件。具体地,第一服务调用第一本地代理,利用对应编程语言框架提供的函数,创建第一本地事务。例如在spring框架下,第一服务可以响应于第一服务请求,调用第一本地代理,利用createtransactonifnecessary()函数创建第一本地事务。其中,创建事务后可以执行如下操作:开始事务(begin transaction)、提交事务(commit transaction)和/或回滚事务(rollback transaction)。
85.当第一服务还需要调用其他服务如第二服务时,第一服务还可以调用第一本地代理创建全局事务。该全局事务具体为第一服务包括的事务操作以及第二服务包括的事务操作形成的操作系列。
86.s206:第一服务调用第一本地代理向第二服务发送第一远程服务请求。
87.第一远程服务请求用于请求远程调用第二服务。与第一服务请求类似,第一远程服务请求可以包括远程调用的第二服务的服务标识。进一步地,第一远程服务请求还可以包括第二服务的参数,该参数是指第二服务的调用参数。在一些示例中,第二服务的调用参数可以是第二服务的调用接口的输入参数和/或输出参数。
88.在本技术实施例中,外部客户端请求调用的服务为始发服务,始发服务的本地代理创建的事务为始发事务。始发服务是接收到服务请求再创建全局事务的,基于此,本地代理还可以在发送至非始发服务的服务请求中携带全局事务的标识即全局事务id,以区分始发服务和非始发服务。服务请求无任何全局事务id则创建全新事务,接收该类请求的服务为始发服务,对应的事务为始发事务,在集群事务协调中负责整体的事务提交发起操作(全局事务提交发起操作)。
89.具体地,第一服务调用第二服务时,可以先调用第一本地代理查询第二服务对应的服务节点,以及调用第一本地代理开启全局事务,并调用第一本地代理生成第一远程服务请求,该远程服务请求携带全局事务标识,如此,第一服务可以通过第一本地代理向第二服务的服务节点发送第一远程服务请求。
90.s208:第二服务调用第二本地代理创建第二本地事务。
91.第二本地事务具体为第二服务包括的事务操作形成的操作序列。其中,事务操作包括数据库操作和非数据库操作等操作类型。数据库操作是指对数据库进行增删查改(即增加、删除、查找和/或改正)的操作。非数据库操作是指除数据库操作以外的操作,例如告警操作等。
92.具体地,第二服务响应于第一远程服务请求,创建第二本地事务。其中,第二服务可以调用第二本地代理,利用对应编程语言框架提供的函数,创建第二本地事务。例如在spring框架下,第二服务调用第二本地代理,利用createtransactonifnecessary()函数创建第二本地事务。其中,创建第二事务后可以执行如下操作:begin transaction、committransaction和/或rollback transaction。
93.s210:所述第一服务调用第一本地代理接收所述第二服务的事务操作,将所述事务操作提交至所述第一本地事务执行。
94.第一本地代理创建的第一本地事务和第二本地代理创建的第二本地事务均未提交,因此,第一本地事务对应的数据和第二本地事务对应的数据并未生效。在一些情况下,第二服务还可以触发针对第一本地事务中数据的事务操作。第一服务调用第一本地代理接收第二服务的事务操作,将该事务操作提交至第一本地事务执行。如此,实现第二服务引用第一服务未生效的业务数据。
95.在一些实现方式中,服务之间可以通过服务请求引用未生效的业务数据。具体地,第二服务还可以通过第二本地代理向第一服务发送第二远程服务请求,该第二远程服务请求用于请求远程调用第一服务。即第二服务回调第一服务。其中,第二远程服务请求中携带全局事务标识,以便第一服务通过第一本地代理根据该全局事务标识查找全局事务在第一服务的事务分支(如第一本地事务)。
96.进一步地,第一服务接收到第二远程服务请求后,可以根据远程服务请求中的全局事务标识查询事务,确定本地存在相应的本地事务分支,即第一本地事务。第一服务可以
调用第一本地代理创建第一本地事务的事务代理,第一服务可以通过该事务代理将第二服务的事务操作提交至第一本地事务执行。
97.在另一些实现方式中,第一服务的第一资源和第二服务的第二资源可以共数据库,此时需要在始发服务(例如第一服务)上操作资源。基于此,第二服务通过第二本地代理进行资源变更登记,如对第二资源进行变更登记,第一服务调用第一本地代理接收第二服务调用第二本地代理对第二资源的变更登记信息。然后第一服务可以调用第一本地代理接收第二服务的事务操作,将其提交至第一本地事务执行。
98.s212:第一服务调用第一本地代理发送全局事务提交请求。
99.第一服务作为始发服务,可以调用第一本地代理发送全局事务提交请求,使得第一服务调用第一本地代理提交第一本地事务,第二服务调用第二本地代理提交第二本地事务,从而将第一本地事务以及第二本地事务对应的数据生效。
100.在一些实现方式中,第一服务可以调用第一本地代理向集群事务管理器发送全局事务提交请求,以使所述集群事务管理器在各事务执行成功时向各本地事务对应的本地代理发送本地事务提交请求。如此,各本地事务对应的本地代理可以响应于本地事务提交请求,通过各自对应的本地代理提交本地事务。例如,第一服务可以响应于本地事务提交请求,调用第一本地代理提交第一本地事务;第二服务可以响应于本地事务提交请求,调用第二本地代理提交第二本地事务。
101.基于上述内容描述,本技术实施例提供了一种全局事务协同方法。该方法通过与服务同进程部署的本地代理去代理服务对外的资源操作请求和/或数据库操作请求,当服务通过rpc接口调用其他服务时,根据需要记录并挂起当前服务的业务进程,通过本地代理向上述其他服务发起远程服务请求,其他服务的本地代理可以创建对应的本地事务。调用侧的服务可以接收被调用侧的服务的事务操作,将其提交到原本地事务执行。调用侧的服务还可以通过本地代理发送全局事务提交请求时,调用侧的服务和被调用侧的其他服务通过各自的本地代理提交各自的本地事务,如此实现对未生效的业务数据的引用。由此可以降低单体应用拆分微服务的难度,易于实现服务化部署。
102.为了使得本技术的技术方案更加易于理解,下面分别从第二服务通过服务请求回调第一服务和第二服务通过第二本地代理操作第一服务的资源角度,结合更具体的实施例对本技术实施例提供的全局事务协同方法进行详细说明。
103.参见图3所示的全局事务协同方法的流程图,如图3所示,第一服务为服务a,第二服务为服务b,第一本地代理为代理a,第二本地代理为代理b,第一服务对应的第一资源为本地资源a,第二服务对应的第二资源为本地资源b。服务a和代理a部署于同一进程,例如第一进程。服务b和代理b部署于同一进程,例如第二进程。该方法包括:
104.1.外部客户端发送第一服务请求,该第一服务请求用于调用服务a。
105.服务端响应于上述第一服务请求,执行如下步骤:
106.1.1:服务a执行针对本地资源a的操作。
107.其中,针对本地资源a的操作可以包括如下步骤:
108.1.1.1:服务a调用代理a创建第一本地事务;
109.1.1.2:服务a调用代理a执行针对本地资源a的资源变更登记。
110.具体地,服务a调用代理a在集群管理器中登记针对本地资源a的资源变更。
111.1.2:服务a调用外部服务(服务名称:服务b,服务参数)
112.其中,调用外部服务可以包括如下步骤:
113.1.2.1:服务a调用代理a查询服务b的服务节点;
114.具体地,代理a查询服务b的服务节点,获得服务节点的地址,以便后续根据该地址向服务节点发送服务请求。
115.1.2.2:服务a调用代理a开始全局事务。
116.在调用外部服务时,服务a调用代理a,通过全局事务标识(全局事务id)查看是否已有对应的事务。如果存在对应的事务,则调用代理a将服务b的事务操作转发到原服务进程处理否则无法使用原事务。如果不存在对应的事务,则按普通的请求任选一个转发。
117.1.3:服务a调用代理a发送第一远程服务请求。
118.其中,第一远程服务请求中包括服务参数,此外,还包括元数据,该元数据包括全局事务id。
119.1.4:服务b调用代理b执行针对本地资源b的操作。
120.其中,针对本地资源b的操作可以包括如下步骤:
121.1.4.1:服务b调用代理b创建第二本地事务;
122.1.4.2:服务b调用代理b执行针对本地资源b的资源变更登记。
123.服务b调用代理b创建第二本地事务,并执行事务退出后,可以不自动提交事务,而是采用两阶段提交方式。具体地,代理b可以等待始发服务的办理通知,以实现统一提交和/或统一回滚事务。
124.其中,服务b还可以通过代理b追加事务操作。如步骤1.4.2.1所示,该追加事务操作携带如下参数:操作服务、全局事务id和操作关键数据。其中,操作服务可以是服务b。
125.1.5:服务b调用外部服务(服务名称:服务a,服务参数)。
126.其中,调用外部服务可以包括如下步骤:
127.1.5.1:服务b调用代理b查询服务a的服务节点;
128.服务a可以由多个服务节点提供服务,代理b可以根据全局事务id查找创建第一本地事务的服务节点,获得服务节点的地址。
129.1.5.2:服务b调用代理b发送第二远程服务请求。
130.第二远程服务请求中携带服务参数和元数据。该元数据具体为全局事务id。
131.服务a调用代理a接收到上述第二远程服务请求后,执行下述步骤:
132.1.5.2.1:服务a调用代理a执行针对本地资源a的操作;
133.1.5.2.2:服务a调用代理a为已有事务创建事务代理。
134.具体地,服务a调用代理a,通过第二远程服务请求中的全局事务id,优先查询本地是否已经存在事务。如果存在,则调用代理a创建事务代理,该事务代理用于转发事务操作至原事务(该示例中为第一本地事务)。如果不存在,则代理a新建会话(session)。
135.1.5.2.3:服务a调用代理a执行针对本地资源a的资源变更登记。
136.需要说明的是,步骤1.1和步骤1.5.2.1中代理a执行针对本地资源a的操作可以是相同的,或是不同的。为了便于描述,本技术实施例将步骤1.1中的上述操作称为针对本地资源a的操作1,将步骤1.5.2.1中的上述操作称为针对本地资源a的操作2。
137.类似地,步骤1.1.2和步骤1.5.2.3中代理b执行针对本地资源a的资源变更登记可
以是相同的,或是不同的。为了便于描述,本技术实施例将步骤1.1.2中的上述操作称为资源变更登记1,将步骤1.5.2.3中的上述操作称为资源变更登记2。
138.1.5.2.4:服务a调用代理a将服务b的事务操作提交到原本地事务执行。
139.具体地,服务a通过该事务代理转发事务操作如变更操作至原本地事务执行。
140.1.5.2.5:服务a还可以调用代理a追加事务操作。
141.例如,服务a为产品,服务b为订单,外部客户端调用服务a将产品加入购物车,服务a调用服务b生成订单,此时,服务a还可以调用代理a追加事务操作,以增加订单中产品的数量。
142.1.6:服务a调用代理a向集群事务管理器发送全局事务提交请求。
143.1.7:集群事务管理器向代理a发送本地事务提交请求,以使代理a提交本地事务。
144.1.8:集群事务管理器向代理b发送本地事务提交请求,以使代理b提交本地事务。
145.图3从服务b回调服务a,引用服务a未生效的业务数据对全局事务协同方法进行介绍,接下来,从服务b操作服务a的资源,因为服务a未生效的业务数据对全局事务协同方法进行介绍。
146.参见图4所示的全局事务协同方法的流程图,如图4所示,第一服务为服务a,第二服务为服务b,第一本地代理为代理a,第二本地代理为代理b,第一服务的第一资源为本地资源a,第二服务的第二资源为本地资源b。服务a和代理a部署于同一进程,例如第一进程。服务b和代理b部署于同一进程,例如第二进程。该方法包括:
147.1.外部客户端发送第一服务请求,该第一服务请求用于调用服务a。
148.服务端响应于上述第一服务请求,执行如下步骤:
149.1.1:服务a调用代理a执行针对本地资源a的操作。
150.其中,针对本地资源a的操作可以包括如下步骤:
151.1.1.1:服务a调用代理a创建第一本地事务;
152.代理a创建第一本地事务,可以获得第一本地事务id和全局事务id。其中,全局事务id可以是通用唯一识别码(universally unique identifier,uuid)。
153.1.1.2:服务a调用代理a执行针对本地资源a的资源变更登记。
154.1.2:服务a调用外部服务(服务名称:服务b,服务参数)
155.其中,调用外部服务可以包括如下步骤:
156.1.2.1:服务a调用代理a查询服务b的地址;
157.1.2.2:服务a调用代理a开始全局事务。
158.在调用外部服务时,服务a可以调用代理a,通过全局事务id查看是否已有对应的事务。如果存在对应的事务,则需要转发到原服务进程处理否则无法使用原事务。如果不存在对应的事务,则按普通的请求任选一个转发。
159.1.3:服务a调用代理a追加事务操作。
160.1.4:服务a调用代理a发送第一远程服务请求。
161.其中,第一远程服务请求中包括服务参数,此外,还包括元数据,该元数据包括全局服务id。
162.服务b响应于第一远程服务请求执行下述步骤:
163.1.4.1:服务b调用代理b执行针对本地资源b的操作。
164.其中,针对本地资源b的操作可以包括如下步骤:
165.1.4.2:服务b调用代理b针对已有事务创建关联关系。
166.具体地,服务b调用代理b创建事务代理。
167.1.4.3:服务b调用代理b查询服务a的地址。
168.1.4.4:服务b调用代理b执行针对本地资源b的资源变更登记。
169.1.4.5:服务b调用代理b向代理a反馈针对本地资源b的资源变更登记。
170.1.4.6:服务a调用代理a将变更操作提交到原本地事务(第一本地事务)执行。
171.1.4.7:服务a调用代理a追加事务操作。
172.1.5:服务a调用代理a发送全局事务提交请求。
173.集群事务管理器响应于全局事务提交请求,执行下述步骤:
174.1.6.1:集群事务管理器向代理b发送本地事务提交请求。
175.1.6.2:集群事务管理器向代理a发送本地事务提交请求。
176.在一些实现方式中,服务之间还可以通过本地代理实现进程内事务引用。下面结合具体实施例进行详细说明。
177.参见图5所示的全局事务协同方法的流程图,如图5所示,第一服务为服务a,第二服务为服务b,第一本地代理为代理a,第二本地代理为代理b。服务a和代理a部署于同一进程,例如第一进程。服务b和代理b部署于同一进程,例如第二进程。该方法包括:
178.1.代理a注册本地事务。
179.具体地,代理a可以在集群事务管理器注册本地事务。
180.2.代理a启动本地事务请求监听。
181.具体地,本地服务(如服务a)调用其他服务(如服务b)时,代理a需要在本地先创建监听队列,该监听队列用于接收外部可能的服务请求,例如上述第一服务请求。该服务请求可以是数据库服务请求。然后代理a就在事务所在进程持续监听请求,如果存在外部添加的数据库操作则直接执行相关操作。
182.其中,代理a启动本地事务请求监听具体包括如下步骤:
183.2.1远程调用未结束时,代理a监控任务队列,并执行数据操作任务。
184.代理a持续监听队列中的服务请求,并根据服务请求执行事务操作,提供回调通知机制返回相关请求结果给调用方.由于本地事务共享同一个连接,所以相关操作根据队列一次执行。
185.3.代理a发送第一远程服务请求。
186.具体地,代理a在原线程采用异步方式发起第一远程服务请求,提供回调接口监听返回值,原线程持续执行数据库队列监听操作。
187.对应地,代理b响应于上述第一远程服务请求,执行下述步骤:
188.3.1代理b调用服务b;
189.服务b可以执行针对本地资源b的变更操作。服务b还操作服务a的资源,以引用服务a未生效的业务数据。
190.3.2服务b向代理b发送服务a事务操作。
191.3.2.1代理b远程执行数据库操作。
192.该操作本身跨进程异步,但是同步阻塞业务方的业务请求.接收方接收到外部服
务进程的本地代理提交的数据库操作请求时直接在原线程采用异步方式发起外部请求,提供回调接口监听返回值,原线程持续执行数据库队列监听操作。
193.3.2.2代理a查找并添加任务到原会话任务队列。
194.代理a基于传入的全局事务id查找本地事务id对应的任务队列,将数据库操作请求添加到队列中,同时注册回调接口用于异步获取数据库操作结果.
195.3.2.3代理a向代理b返回执行结果。
196.代理a直接回调原来注册的接口按原路径返回请求结果。
197.3.2.4代理b向服务b返回服务a事务操作结果。
198.3.3服务b业务处理。
199.3.4服务b返回服务b结果。
200.其中,服务b可以向代理b返回服务b结果,然后由代理b执行下述操作:
201.3.4.1代理b向代理a返回远程服务调用结果。
202.代理b不立即提交事务,直接挂起等待集群事务管理器的通知.
203.4.代理a结束本地事务请求监听。
204.5.代理a向服务a返回服务a操作结果。
205.在一些实现方式中,本技术还提供了本地代理的注册保活机制。注册保活与微服务的注册保活类似,用于服务健康检查,在检查到服务异常则停止调度,通知回滚相关的事务确保事务一致性。
206.具体地,如图6所示,服务启动后,服务对应的本地代理,例如第一服务对应的第一本地代理(该示例中为代理a)可以在集群事务管理器注册。当所述第一本地代理处于正常状态时,第一本地代理可以响应于所述集群事务管理器发送的健康检查请求发送反馈。集群事务管理器可以启动定时器,当定时器到达设定时间,集群事务管理器未接收到第一本地代理的反馈,则可以认为第一本地代理异常,第一服务健康检查不通过。
207.基于此,集群事务管理器可以根据各个服务的本地代理是否发送反馈,记录各个服务的健康状态。当服务异常或者不健康时,集群事务管理器可以启动关联事务回滚。具体地,集群事务管理器可以便利关联事务列表,然后根据关联事务列表进行事务回滚。
208.在一些实现方式中,本地代理主要回滚外部第三方的资源(比如文件请求,外部saas服务请求)。由于这类请求各异,集群事务管理器基于登记的日志直接通知原服务回滚,具体回滚方法由各服务定制。本地事务相关异常则直接提示风险由人工介入。
209.进一步地,如图7所示,当所述第一本地代理由异常状态恢复为正常状态时,所述第一本地代理可以重新在所述集群事务管理器注册。所述第一本地代理接收所述集群事务管理器的回滚请求,进行事务回滚。
210.本技术实施例提供的事务协同方法主要将单体应用拆分为服务或者微服务,能够实现服务或微服务之间相互引用未生效的业务数据,支持事务内数据对第三方服务可见,实现服务平滑拆分。由此可以支持分服务异构数据栈演进和细粒度按需扩缩容。
211.为了便于理解,本技术还提供了一具体示例。如图8所示,openstack neutron的各个插件(plugin)例如service plugin、core plugin和驱动(driver)独立进程部署,而且支持相互之间透明调用,实现插件和driver跨进程调用的事务协同处理。
212.进一步地,本技术实施例还提供了service plugin和core plugin拆分进程的示
意图。如图9所示,service plugin访问core plugin的相关api\通知和数据库都采用代理的方式。
213.具体地,neutron server的服务入口是pecan,全局事务可以通过自定义header传递,通过在pecan里自定义hook的方式增加扩展,识别restful中的header字段并存储到线程本地中。同时在hook里提供contextproxy,用于扩展sessionproxy,在业务通过context获取session的时候基于全局事务id判断本地事务的获取方式,如果已经存在同事务的本地会话则创建代理转发相关请求。
214.在serverplugin服务进程提供对其他plugin(这里以coreplugin为例)配置proxy,代理所有coreplugin的api请求,并转发到其他进程。这里的代理方式可以用继承的方式,也可以用function hook的方式.
215.进一步地,本技术实施例还提供callbackmanager代理。service plugin监听coreplugin的资源变更事件的相关注册会统一记录到集群事务管理器。集群事务管理器将服务订阅情况通知core plugin进程。coreplugin进程发生资源变更的时候会根据事务状态选一个service plugin发送资源变更通知。service plugin本地的callback组件可以通知相关的回调接口实现跨进程通知。
216.上文结合图1至图9对本技术实施例提供的全局事务协同方法进行了详细介绍,下面将结合附图对本技术实施例提供的装置、设备进行介绍。
217.参见图10所示的全局事务协同装置的结构示意图,如图10所示,该装置1000包括:
218.通信模块1002,用于接收来自于客户端的第一服务请求,所述第一服务请求用于请求调用第一服务;
219.创建模块1004,用于调用第一本地代理创建第一本地事务;
220.所述通信模块1002,还用于调用所述第一本地代理向第二服务发送第一远程服务请求,以使所述第二服务调用第二本地代理创建第二本地事务;
221.所述通信模块1002,还用于调用所述第一本地代理接收所述第二服务的事务操作;
222.提交模块1006,用于调用所述第一本地代理将所述事务操作提交至所述第一本地事务执行;
223.所述通信模块1002,还用于调用所述第一代理发送全局事务提交请求,以使所述第一服务调用所述第一本地代理提交所述第一本地事务,所述第二服务调用所述第二本地代理提交所述第二本地事务。
224.在一些可能的实现方式中,所述通信模块1002还用于:
225.在调用第一本地代理接收所述第二服务的事务操作之前,接收来自于所述第二服务调用所述第二本地代理的第二远程服务请求,所述第二远程服务请求用于远程调用所述第一服务,所述第二远程服务请求包括全局事务标识。
226.在一些可能的实现方式中,所述创建模块1004还用于:
227.调用所述第一本地代理创建第一本地事务的事务代理;
228.所述提交模块1006具体用于:
229.通过所述事务代理将所述事务操作提交至所述第一本地事务执行。
230.在一些可能的实现方式中,所述通信模块1002还用于:
memory),例如只读存储器(read-only memory,rom),快闪存储器,机械硬盘(hard drive drive,hdd)或固态硬盘(solid state drive,ssd)。
251.存储器1104中存储有可执行代码,处理器1102执行该可执行代码以执行前述全局事务协同方法。
252.具体地,在实现图10所示实施例的情况下,且图10实施例中所描述的全局事务协同装置的各模块为通过软件实现的情况下,执行图10中的创建模块1004、提交模块1006功能所需的软件或程序代码存储在存储器1104中。通信模块功能通过通信接口1103实现。
253.通信接口1103接收来自于客户端的第一服务请求,将其通过总线1101传输至处理器1102,处理器1102执行存储器1104中存储的各单元对应的程序代码,如创建模块1004、提交模块1006对应的程序代码,以执行前述全局事务协同方法。
254.具体地,通信接口1103接收来自于客户端的第一服务请求,处理器1102执行创建模块1004对应的程序代码,以执行调用第一本地代理创建第一本地事务的步骤,通信接口1103还调用第一本地代理向第二服务发送第一远程服务请求,以使第二服务调用第二本地代理创建第二本地事务。
255.通信接口1103调用第一本地代理接收第二服务的事务操作,处理器1102执行提交模块1006对应的程序代码,以执行调用第一本地代理将事务操作提交至第一本地事务执行的步骤。通信接口1103还调用第一本地代理发送全局事务提交请求,以使得第一服务调用第一本地代理提交第一本地事务,第二服务调用第二本地代理提交第二本地事务。
256.在一些实现方式中,通信接口1103还用于:
257.接收来自于所述第二服务调用所述第二本地代理的第二远程服务请求,所述第二远程服务请求用于远程调用所述第一服务,所述第二远程服务请求包括全局事务标识。
258.在一些实现方式中,处理器1102还用于执行创建模块1004对应的程序代码,以执行如下方法步骤:
259.调用所述第一本地代理创建第一本地事务的事务代理;
260.处理器1102具体用于执行提交模块1006对应的程序代码,以执行如下方法步骤:
261.通过所述事务代理将所述事务操作提交至所述第一本地事务执行。
262.在一些实现方式中,通信接口1103还用于:
263.调用所述第一本地代理接收所述第二服务调用所述第二本地代理对第二资源的变更登记信息。
264.在一些实现方式中,处理器1102还用于执行查询模块、开启模块、生成模块对应的程序代码,以执行如下方法步骤:
265.调用所述第一本地代理查询所述第二服务对应的服务节点;
266.调用所述第一本地代理开启全局事务,调用所述第一本地代理生成第一远程服务请求,所述第一远程服务请求携带全局事务标识,所述第一远程服务请求用于远程调用所述第二服务。
267.在一些实现方式中,通信接口1103具体用于:
268.调用所述第一本地代理向集群事务管理器发送全局事务提交请求,以使所述集群事务管理器在各事务执行成功时向各本地事务对应的本地代理发送本地事务提交请求。
269.在一些实现方式中,处理器1102还用于执行注册模块对应的程序代码,以执行如
下方法步骤:
270.调用所述第一本地代理在集群事务管理器注册;
271.通信接口1103还用于:
272.当所述第一本地代理处于正常状态时,所述第一服务响应于所述集群事务管理器发送的健康检查请求调用所述第一本地代理发送反馈。
273.在一些实现方式中,处理器1102还用于执行注册模块、回滚模块对应的程序代码,以执行如下方法步骤:
274.当所述第一本地代理由异常状态恢复为正常状态时,、调用所述第一本地代理重新在所述集群事务管理器注册;
275.调用所述第一本地代理接收所述集群事务管理器的回滚请求,进行事务回滚。
276.本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质包括指令,所述指令指示计算机执行上述全局事务协同装置1000的全局事务协同方法。
277.本技术实施例还提供了一种计算机程序产品,所述计算机程序产品被计算机执行时,所述计算机执行前述全局事务协同方法的任一方法。该计算机程序产品可以为一个软件安装包,在需要使用前述全局事务协同方法的任一方法的情况下,可以下载该计算机程序产品并在计算机上执行该计算机程序产品。
278.另外需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本技术提供的装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。
279.通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本技术可借助软件加必需的通用硬件的方式来实现,当然也可以通过专用硬件包括专用集成电路、专用cpu、专用存储器、专用元器件等来实现。一般情况下,凡由计算机程序完成的功能都可以很容易地用相应的硬件来实现,而且,用来实现同一功能的具体硬件结构也可以是多种多样的,例如模拟电路、数字电路或专用电路等。但是,对本技术而言更多情况下软件程序实现是更佳的实施方式。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘、u盘、移动硬盘、rom、ram、磁碟或者光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,训练设备,或者网络设备等)执行本技术各个实施例所述的方法。
280.在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。
281.所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、训练设备或数据中心通过有线
(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、训练设备或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的训练设备、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘(solid state disk,ssd))等。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献