CN115756768A - 基于saga的分布式事务处理方法、装置、设备及介质 - Google Patents

基于saga的分布式事务处理方法、装置、设备及介质 Download PDF

Info

Publication number
CN115756768A
CN115756768A CN202310035829.4A CN202310035829A CN115756768A CN 115756768 A CN115756768 A CN 115756768A CN 202310035829 A CN202310035829 A CN 202310035829A CN 115756768 A CN115756768 A CN 115756768A
Authority
CN
China
Prior art keywords
transaction
sub
distributed
execution
distributed transaction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202310035829.4A
Other languages
English (en)
Other versions
CN115756768B (zh
Inventor
王颖奇
冯斌
兰锦
李重辰
王旭辉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Fulin Technology Co Ltd
Original Assignee
Shenzhen Fulin Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shenzhen Fulin Technology Co Ltd filed Critical Shenzhen Fulin Technology Co Ltd
Priority to CN202310035829.4A priority Critical patent/CN115756768B/zh
Publication of CN115756768A publication Critical patent/CN115756768A/zh
Application granted granted Critical
Publication of CN115756768B publication Critical patent/CN115756768B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请实施例属于计算机领域,涉及一种基于saga的分布式事务处理方法,包括:当接收到事务处理请求时,获取分布式事务;提取所述分布式事务的业务标识,以根据所述业务标识对所述分布式事务进行加锁处理;获取事务工厂中的子事务列表,根据所述子事务列表,将所述分布式事务拆分为若干个子事务,并获取子事务执行顺序,其中,所述事务工厂为对基于saga的分布式事务进行定义与配置的组件;按照所述子事务执行顺序执行各子事务,并在执行完毕后对所述分布式事务进行解锁处理;当对所述各子事务执行成功时,得到所述分布式事务的事务处理结果。本申请还提供一种基于saga的分布式事务处理装置、计算机设备及存储介质。本申请简化了saga事务幂等性的实现。

Description

基于saga的分布式事务处理方法、装置、设备及介质
技术领域
本申请涉及计算机技术领域,尤其涉及一种基于saga的分布式事务处理方法、装置、计算机设备及存储介质。
背景技术
分布式事务是指事务的发起者、资源及资源管理器和事务处理者分别位于分布式系统的不同节点之上。由于涉及到多个节点,分布式事务的最终一致性显得尤为重要。针对处理分布式事务,当前提出了两段式提交(2 phase commit,2PC)、三段式提交(3 phasecommit,3PC)、可靠事件队列、TCC事务(Try-Confirm-Cancel)和saga事务等解决方案。其中,saga是将一个事务分解为若干个子事务,子事务可以单独提交,具有较高的灵活性,使用较多。
在saga中,事务具有正向事件和反向事件,saga要求正向事件和反向事件都要满足幂等性从而确保数据一致性。在复杂业务中,这会引入更多复杂性,并导致对已有的业务系统逐一改造的成本过高。而且,saga只是提出了一些规范,并没有具体规定如何实现,使得当前基于saga的分布式事务处理较为凌乱。
发明内容
本申请实施例的目的在于提出一种基于saga的分布式事务处理方法、装置、计算机设备及存储介质,以简化saga事务幂等性的实现。
为了解决上述技术问题,本申请实施例提供一种基于saga的分布式事务处理方法,采用了如下所述的技术方案:
当接收到事务处理请求时,获取分布式事务;
提取所述分布式事务的业务标识,以根据所述业务标识对所述分布式事务进行加锁处理;
获取事务工厂中的子事务列表,根据所述事务工厂中的子事务列表,将所述分布式事务拆分为若干个子事务,并获取子事务执行顺序,其中,所述事务工厂为对基于saga的分布式事务进行定义与配置的组件;
按照所述子事务执行顺序执行各子事务,并在执行完毕后对所述分布式事务进行解锁处理;
当对所述各子事务执行成功时,得到所述分布式事务的事务处理结果。
为了解决上述技术问题,本申请实施例还提供一种基于saga的分布式事务处理装置,采用了如下所述的技术方案:
事务获取模块,用于当接收到事务处理请求时,获取分布式事务;
加锁处理模块,用于提取所述分布式事务的业务标识,以根据所述业务标识对所述分布式事务进行加锁处理;
事务拆分模块,用于获取事务工厂中的子事务列表,根据所述事务工厂中的子事务列表,将所述分布式事务拆分为若干个子事务,并获取子事务执行顺序,其中,所述事务工厂为对基于saga的分布式事务进行定义与配置的组件;
事务执行模块,用于按照所述子事务执行顺序执行各子事务,并在执行完毕后对所述分布式事务进行解锁处理;
结果生成模块,用于当对所述各子事务执行成功时,得到所述分布式事务的事务处理结果。
为了解决上述技术问题,本申请实施例还提供一种计算机设备, 所述计算机设备包括存储器和处理器,所述存储器中存储有计算机可读指令,所述处理器执行所述计算机可读指令时实现如上所述的基于saga的分布式事务处理方法的步骤。
为了解决上述技术问题,本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机可读指令,所述计算机可读指令被处理器执行时实现如上所述的基于saga的分布式事务处理方法的步骤。
与现有技术相比,本申请实施例主要有以下有益效果:获取分布式事务后,提取分布式事务的业务标识,业务标识可以反应分布式事务所进行的业务处理,根据业务标识对分布式事务进行加锁处理,可以避免重复请求对同一个操作对象进行多次重复处理,避免了幂等性要求所针对情况的发生,而无需对业务系统的每个环节都进行改造;事务工厂用于对基于saga的分布式事务进行定义与配置,根据事务工厂中的子事务列表,将分布式事务拆分为若干个子事务,按照子事务执行顺序执行各子事务,并在执行完毕后对分布式事务进行解锁处理,确保后续分布式事务的正常执行;当对各子事务执行成功时,得到分布式事务的事务处理结果;本申请通过加锁处理,减少了对已有业务系统的改造,简化了saga事务的幂等性实现。
附图说明
为了更清楚地说明本申请中的方案,下面将对本申请实施例描述中所需要使用的附图作一个简单介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请可以应用于其中的示例性系统架构图;
图2是根据本申请的基于saga的分布式事务处理方法的一个实施例的流程图;
图3是根据本申请的基于saga的分布式事务处理装置的一个实施例的结构示意图;
图4是根据本申请的计算机设备的一个实施例的结构示意图。
具体实施方式
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同;本文中在申请的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本申请;本申请的说明书和权利要求书及上述附图说明中的术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排他的包含。本申请的说明书和权利要求书或上述附图中的术语“第一”、“第二”等是用于区别不同对象,而不是用于描述特定顺序。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
为了使本技术领域的人员更好地理解本申请方案,下面将结合附图,对本申请实施例中的技术方案进行清楚、完整地描述。
如图1所示,系统架构100可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103上可以安装有各种通讯客户端应用,例如网页浏览器应用、购物类应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等。
终端设备101、102、103可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、电子书阅读器、MP3播放器( Moving Picture ExpertsGroup Audio Layer III,动态影像专家压缩标准音频层面3 )、MP4( Moving PictureExperts Group Audio Layer IV,动态影像专家压缩标准音频层面4 )播放器、膝上型便携计算机和台式计算机等等。
服务器105可以是提供各种服务的服务器,例如对终端设备101、102、103上显示的页面提供支持的后台服务器。
需要说明的是,本申请实施例所提供的基于saga的分布式事务处理方法一般由服务器执行,相应地,基于saga的分布式事务处理装置一般设置于服务器中。
应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
继续参考图2,示出了根据本申请的基于saga的分布式事务处理方法的一个实施例的流程图。所述的基于saga的分布式事务处理方法,包括以下步骤:
步骤S201,当接收到事务处理请求时,获取分布式事务。
在本实施例中,基于saga的分布式事务处理方法运行于其上的电子设备(例如图1所示的服务器)可以通过有线连接方式或者无线连接方式与终端设备进行通信。需要指出的是,上述无线连接方式可以包括但不限于3G/4G/5G连接、WiFi连接、蓝牙连接、WiMAX连接、Zigbee连接、UWB( ultra wideband )连接、以及其他现在已知或将来开发的无线连接方式。
其中,事务处理请求可以是请求服务器处理分布式事务的请求。
具体地,当服务器接收到事务处理请求时,获取该事务处理请求所对应的分布式事务。
步骤S202,提取分布式事务的业务标识,以根据业务标识对分布式事务进行加锁处理。
具体地,分布式事务具有标识,通常,分布式事务的标识有两种,一种是只有物理意义的物理标识,物理标识可以是随机生成的字符串,具有全局唯一性,不具备业务意义。例如,在订单场景中,多次操作一个订单,每次的分布式事务的物理标识是不同的。
另一种标识是业务标识,业务标识是从业务角度生成的标识,具有较高的可读性。提取到业务标识后,可以根据业务标识对分布式事务进行加锁处理,避免两个不同的分布式事务同时处理同一批操作对象产生数据错误。其中,操作对象可以是分布式事务中被操作的对象,例如上述例子中的订单,通过加锁处理,可以避免两个分布式事务同时修改到同一张订单。
步骤S203,获取事务工厂中的子事务列表,根据事务工厂中的子事务列表,将分布式事务拆分为若干个子事务,并获取子事务执行顺序,其中,事务工厂为对基于saga的分布式事务进行定义与配置的组件。
本申请中的服务器可以设置有基于saga事务处理框架或者saga组件,它可以包含事务处理器和事务队列、执行器、存储容器。其中,事务工厂可以存在于事务处理器中,是对基于saga的分布式事务进行定义与配置的工具组件。
事务处理器用于对分布式事务进行整体的管理与调度,可以通过事务队列进行事务调度,执行器用于执行具体的子事务。存储容器用于在事务执行过程中,存储持久子事务和事务执行日志,持久子事务和事务执行日志的作用会在后文进行说明。
本申请需要预先在事务工厂中声明各类分布式事务,并可以通过子事务列表的形式定义分布式事务包含哪些子事务,接收到分布式事务后,需要将分布式事务中的哪些参数传递给子事务从而初始化子事务;子事务之间可以具有依赖关系,因此子事务也具有执行的先后顺序,即可以预先确定子事务执行顺序;事务工厂提供注册接口,上述信息预先通过注册接口注册到事务工厂中。
具体地,在获取到分布式事务后,根据分布式事务的事务类型和事务工厂的子事 务列表,对分布式事务T进行分解,得到若干个子事务
Figure 623379DEST_PATH_IMAGE001
,并可以从事务工厂获 取各子事务对应的子事务执行顺序。
在saga中,每个子事务都具有正向事件和反向事件,反向事件即回滚事件,其逻辑与正向事件相反,正向事件和反向事件满足交换律,先执行正向事件再执行反向事件等于无事发生,例如正向时间为将库存增加到指定数量,反向事件则为将库存减少到指定数量。正向事件和反向事件应该满足幂等性,即多次执行的结果都一样,在现有技术中,会对业务系统进行复杂的改造以满足幂等性的要求。
在一个实施例中,事务处理器在接收到分布式事务后,首先校验分布式事务是否符合预设要求,预设要求是执行分布式事务的先决条件,其具体内容与分布式事务的事务细节相关。例如,分布式事务是从用户A的账户中转出100元,如果该账户中当前只有80元,则分布式事务不符合预设要求,为非法事务,事务处理器可以拦截该分布式事务并返回提示信息。如果分布式事务符合预设要求,则该分布式事务为合法事务,将分布式事务提交到事务队列,从而从业务上保障分布式事务的隔离性,并分别对事务队列中的分布式事务进行处理。
步骤S204,按照子事务执行顺序执行各子事务,并在执行完毕后对分布式事务进行解锁处理。
具体地,按照子事务执行顺序执行各子事务,子事务执行完毕后得到子事务执行结果,子事务执行结果可以被传递给下一个执行的子事务。对各子事务执行完毕后,根据分布式事务的业务标识进行解锁处理。
步骤S205,当对各子事务执行成功时,得到分布式事务的事务处理结果。
具体地,如果对各子事务均执行成功,则成功完成对分布式事务的处理,基于子事务执行结果可以得到分布式事务的事务处理结果,该结果可以被返回给终端。
本实施例中,获取分布式事务后,提取分布式事务的业务标识,业务标识可以反应分布式事务所进行的业务处理,根据业务标识对分布式事务进行加锁处理,可以避免重复请求对同一个操作对象进行多次重复处理,避免了幂等性要求所针对情况的发生,而无需对业务系统的每个环节都进行改造;事务工厂用于对基于saga的分布式事务进行定义与配置,根据事务工厂中的子事务列表,将分布式事务拆分为若干个子事务,按照子事务执行顺序执行各子事务,并在执行完毕后对分布式事务进行解锁处理,确保后续分布式事务的正常执行;当对各子事务执行成功时,得到分布式事务的事务处理结果;本申请通过加锁处理,减少了对已有业务系统的改造,简化了saga事务的幂等性实现。
进一步的,上述获取分布式事务的步骤之后,还可以包括:确定分布式事务的数据量级别;根据数据量级别选取saga组件,以基于saga组件提取分布式事务的业务标识,以根据业务标识对分布式事务进行加锁处理。
具体地,分布式事务来自业务处理,业务处理具有不同的数据规模,因此分布式事务具有数据量级别。例如,在低并发业务场景和高并发业务场景中,数据规模具有较大差异,高并发业务场景可以产生大量的分布式事务,因此可以给低并发业务场景的分布式事务添加数据量较低的数据量级别标签,给高并发业务场景的分布式事务添加数据量较高的数据量级别标签。
对于不同的数据量级别,可以选取不同的saga组件。Saga组件包含事务处理器和事务队列、执行器、存储容器,在数据量级别较低的情况下,它们可以部署于同一台服务器上,其中,存储容器需要单独占据一个进程,以减少事务执行异常的影响,尽可能在事务执行异常时可以重新执行事务。
本申请中对事务队列、执行器、存储容器没有指定特别的实现方式,可以根据需求进行任意搭配。在数据量级别较低的情况下,事务队列可以使用各种语言中的队列,例如Golang中的channel,或者Java中的线程安全的队列;存储容器也可以根据实际的业务场景选择存储中间件;执行器可以是Golang中的routine,或者Java中的线程。
在数据量级别较高的情况下,需要提高吞吐量,可以将上述组件都更换为分布式组件,搭建分布式事务处理集群,此时,事务队列可以使用kafka、rebitmq等常见的消息队列中间件;存储容器也可以更换为分布式存储;可以在多台机器上按需增加执行器。
在一个实施例中,子事务之间也可以不具有依赖性,此时,可以通过多个执行器并行执行子事务,提高执行效率。
选取到saga组件后,通过saga组件对分布式事务进行处理,例如提取分布式事务的事务标识,以根据事务标识对分布式事务进行加锁处理。
本实施例中,确定分布式事务的数据量级别,根据数据量级别选取不同处理性能的saga组件处理分布式事务,确保了分布式事务的处理效率。
进一步的,上述提取分布式事务的业务标识的步骤可以包括:根据分布式事务的事务类型,从分布式事务中提取预设类型字段,其中,预设类型字段包括事务主体标识和操作对象标识;拼接提取到的事务主体标识和操作对象标识,得到分布式事务的业务标识。
具体地,分布式事务具有事务类型,事务工厂可以预先定义不同事务类型需要提取的预设类型字段。预设类型字段包括事务主体标识和操作对象标识,其中,事务主体标识是事务的主题信息,声明对什么主体进行什么操作,操作对象标识包括主动对象标识和被动对象标识,其中,主动对象标识可以是发起操作的对象的标识,被动对象标识可以是操作所指向的对象的标识。例如,在订单场景中,用户下单触发分布式事务,事务主体标识包括订单号和下单标识,主动对象标识可以是用户的付款账号,被动对象标识可以是商家的收款账号。
根据预设的拼接顺序对提取到的预设类型字段进行拼接,得到分布式事务的业务标识,业务标识具有业务意义,可读性较高,通过业务标识可以大概获取到分布式事务是要做什么。
本实施例中,根据分布式事务的事务类型提取预设类型字段,预设类型字段包括事务主体标识和操作对象标识,使得拼接预设类型字段得到的业务标识具有较高的可读性,便于对分布式事务进行判断。
进一步的,上述根据业务标识对分布式事务进行加锁处理的步骤可以包括:查询业务标识所对应的分布式事务的事务状态;当查询到事务状态为锁定状态时,丢弃分布式事务;当未查询到事务状态时,对业务标识所对应的分布式事务进行加锁处理。
具体地,saga组件中具有锁定状态表,记录业务标识所对应的分布式事务的事务状态。在锁定状态表中查询业务标识所对应分布式事务的事务状态。如果查询到事务状态为锁定状态,则表示已经接收到了相同的分布式事务,发起了重复请求,此时可以将该分布式事务予以丢弃。如果未查询到业务标识的事务状态,则表示为首次接收到该分布式事务,可以对业务标识所对应的分布式事务进行加锁处理。
本实施例中,通过查询事务标识所对应分布式事务的事务状态,对分布式事务进行丢弃或者加锁处理,避免了执行重复请求,从另一维度实现了幂等性要求。
进一步的,上述按照子事务执行顺序执行各子事务的步骤可以包括:对于子事务执行顺序中的每个子事务,对子事务进行持久化得到持久子事务;通过执行器池中的执行器执行子事务,并对执行器的执行过程进行记录得到事务执行日志,其中,事务执行日志包括执行历史和回滚参数。
具体地,根据子事务执行顺序执行子事务时,可以先对子事务进行事务持久化,得到持久子事务。具体的持久化方式由事务队列中间件提供,例如使用redis做队列,则依赖redis的持久化方式;使用kafka做事件队列,则由kafka做持久化。如果提交分布式事务时,事务队列已满,则该分布式事务的提交会被拒绝,执行会被延后。
本申请设置了执行器池,执行器中有多个执行器,每个执行器可以独享一个进程或者线程。执行器负责子事务的具体执行,在执行器执行子事务时,会产生中间参数,这些中间参数会被记录下来得到回滚参数。回滚参数在子事务正向事件执行异常,需要回滚时使用,用于确保正向事件执行的正确性。同时,执行器每执行一个子事务,都会及时记录当前执行的子事务,得到执行历史。执行历史和回滚参数构成事务执行日志,事务执行日志和持久子事务可以保存在存储容器中。
在一个实施例中,也可以对分布式事务进行持久化。
本实施例中,在子事务执行前进行持久化得到持久子事务,并对子事务的执行过程进行记录得到事务执行日志,事务执行日志包括执行历史和回滚参数,以应对可能发生的事务异常。
进一步的,上述通过执行器池中的执行器执行子事务的步骤可以包括:当执行器池中存在空闲执行器时,在各空闲执行器中确定目标执行器,以通过目标执行器执行子事务;当执行器池中工作执行器的数量小于预设的最大阈值且不存在空闲执行器时,创建执行器作为目标执行器,以通过目标执行器执行子事务;当执行器池中工作执行器的数量等于预设的最大阈值时,进入等待执行状态,其中,等待执行状态在出现目标执行器时结束。
具体地,事务处理器内部维护了执行器池(Executor Pool),执行器池配置了执行器数量的最大阈值、核心执行器数量、最大存在时长等参数。
执行器池即便在空闲时,也会维持核心执行器数量的执行器,以便事务到达时可以第一时间进行处理,降低创建执行器延迟对事务吞吐量的影响。
当子事务到达时,如果执行器池中存在空闲执行器(没有执行任何事务的执行器),则在空闲执行器中任意选取一个作为目标执行器,并通过该目标执行器执行子事务。
当子事务到达时,如果执行器池中工作执行器(正在执行事务的执行器)的数量小于最大阈值,且没有空闲执行器,表示当前已有的执行器均在执行事务,但执行器数量未达到最大数量,此时可以创建新的执行器作为目标执行器,通过目标执行器执行子事务。
如果子事务到达时,执行器池中工作执行器的数量等于最大阈值,表示当前已有的执行器均在执行事务,且执行器数量达到最大数量,此时子事务进行等待执行状态,直到某个执行器可以作为目标执行器,退出等待执行状态并开始执行。
如果执行器池中存在空闲执行器,其存在时长大于等于最大存在时长,且此时执行器的数量大于核心执行器数量,则该执行器会被释放,直到存在的执行器数量等于核心执行器数量,以减少维持空闲执行器带来的资源浪费。
本实施例中,执行器池中的执行器存在数量管理策略,并基于该策略控制子事务的执行,确保了子事务的执行效率并可以控制执行器池的资源占用。
进一步的,上述通过执行器池中的执行器执行子事务,并对执行器的执行过程进行记录得到事务执行日志的步骤之后,还可以包括:当出现事务执行异常时,根据事务执行日志中的执行历史确定出现异常时执行的子事务;根据持久子事务恢复子事务,并根据事务执行日志中的回滚参数对子事务进行回滚处理,以重新执行子事务。
具体地,saga组件在执行过程中可能产生崩溃等异常,导致子事务执行过程中断;或者,事务处理结果或者子事务的子事务执行结果不符合预设要求,这些都属于事务执行异常。Saga组件需要确定出现异常时执行的子事务,具体可以从事务执行日志中的执行历史获取,例如,执行历史记录了执行到子事务A时,子事务中断,则从子事务A处开始重新执行。获取该子事务对应的持久子事务,根据持久子事务恢复该子事务,获取到该子事务执行前的初始数据。并且,从事务执行日志中获取该子事务的回滚参数,根据回滚参数对该子事务进行回滚处理,将该子事务恢复到未被执行的状态,以便重新执行。
回滚参数是指子事务执行过程产生的中间参数,例如,在子事务执行过程中,在数据库中插入一条数据,然后子事务中断。如果直接根据持久子事务恢复到的数据运行子事务,而不取消之前对数据库的操作,会产生数据错误,因此,需要根据回滚参数,消除上次执行子事务所带来的影响。如果各子事务均执行成功,则可以删除事务执行日志中的回滚参数。
回滚参数可以在redis中以key-value的形式进行存储,其中,主键key可以是分布式事务的业务标识与子事务编号,value可以是具体的回滚参数。
本实施例中,当出现事务执行异常时,根据事务执行日志中的执行历史确定出现异常时执行的子事务,根据持久子事务恢复子事务,并根据事务执行日志中的回滚参数对子事务进行回滚处理,将子事务恢复至初始状态重新执行,以保证子事务执行的准确性。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机可读指令来指令相关的硬件来完成,该计算机可读指令可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,前述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)等非易失性存储介质,或随机存储记忆体(Random Access Memory,RAM)等。
应该理解的是,虽然附图的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,其可以以其他的顺序执行。而且,附图的流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,其执行顺序也不必然是依次进行,而是可以与其他步骤或者其他步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
进一步参考图3,作为对上述图2所示方法的实现,本申请提供了一种基于saga的分布式事务处理装置的一个实施例,该装置实施例与图2所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
如图3所示,本实施例所述的基于saga的分布式事务处理装置300包括:事务获取模块301、加锁处理模块302、事务拆分模块303、事务执行模块304以及结果生成模块305,其中:
事务获取模块301,用于当接收到事务处理请求时,获取分布式事务。
加锁处理模块302,用于提取分布式事务的业务标识,以根据业务标识对分布式事务进行加锁处理。
事务拆分模块303,用于获取事务工厂中的子事务列表,根据事务工厂中的子事务列表,将分布式事务拆分为若干个子事务,并获取子事务执行顺序,其中,事务工厂为对基于saga的分布式事务进行定义与配置的组件。
事务执行模块304,用于按照子事务执行顺序执行各子事务,并在执行完毕后对分布式事务进行解锁处理。
结果生成模块305,用于当对各子事务执行成功时,得到分布式事务的事务处理结果。
本实施例中,获取分布式事务后,提取分布式事务的业务标识,业务标识可以反应分布式事务所进行的业务处理,根据业务标识对分布式事务进行加锁处理,可以避免重复请求对同一个操作对象进行多次重复处理,避免了幂等性要求所针对情况的发生,而无需对业务系统的每个环节都进行改造;事务工厂用于对基于saga的分布式事务进行定义与配置,根据事务工厂中的子事务列表,将分布式事务拆分为若干个子事务,按照子事务执行顺序执行各子事务,并在执行完毕后对分布式事务进行解锁处理,确保后续分布式事务的正常执行;当对各子事务执行成功时,得到分布式事务的事务处理结果;本申请通过加锁处理,减少了对已有业务系统的改造,简化了saga事务的幂等性实现。
在本实施例的一些可选的实现方式中,基于saga的分布式事务处理装置300还可以包括:级别确定模块,其中:
级别确定模块,用于确定分布式事务的数据量级别。
加锁处理模块302还用于根据数据量级别选取saga组件,以基于saga组件提取分布式事务的业务标识,以根据业务标识对分布式事务进行加锁处理。
本实施例中,确定分布式事务的数据量级别,根据数据量级别选取不同处理性能的saga组件处理分布式事务,确保了分布式事务的处理效率。
在本实施例的一些可选的实现方式中,加锁处理模块302可以包括:字段提取子模块以及字段拼接子模块,其中:
字段提取子模块,用于根据分布式事务的事务类型,从分布式事务中提取预设类型字段,其中,预设类型字段包括事务主体标识和操作对象标识。
字段拼接子模块,用于拼接提取到的事务主体标识和操作对象标识,得到分布式事务的业务标识。
本实施例中,根据分布式事务的事务类型提取预设类型字段,预设类型字段包括事务主体标识和操作对象标识,使得拼接预设类型字段得到的业务标识具有较高的可读性,便于对分布式事务进行判断。
在本实施例的一些可选的实现方式中,加锁处理模块302还可以包括:状态查询子模块、事务丢弃子模块以及事务加锁子模块,其中:
状态查询子模块,用于查询业务标识所对应的分布式事务的事务状态。
事务丢弃子模块,用于当查询到事务状态为锁定状态时,丢弃分布式事务。
事务加锁子模块,用于当未查询到事务状态时,对业务标识所对应的分布式事务进行加锁处理。
本实施例中,通过查询事务标识所对应分布式事务的事务状态,对分布式事务进行丢弃或者加锁处理,避免了执行重复请求,从另一维度实现了幂等性要求。
在本实施例的一些可选的实现方式中,事务执行模块304可以包括:事务持久子模块以及事务执行子模块,其中:
事务持久子模块,用于对于子事务执行顺序中的每个子事务,对子事务进行持久化得到持久子事务。
事务执行子模块,用于通过执行器池中的执行器执行子事务,并对执行器的执行过程进行记录得到事务执行日志,其中,事务执行日志包括执行历史和回滚参数。
本实施例中,在子事务执行前进行持久化得到持久子事务,并对子事务的执行过程进行记录得到事务执行日志,事务执行日志包括执行历史和回滚参数,以应对可能发生的事务异常。
在本实施例的一些可选的实现方式中,事务执行子模块可以包括:第一执行单元、第二执行单元以及等待单元,其中:
第一执行单元,用于当执行器池中存在空闲执行器时,在各空闲执行器中确定目标执行器,以通过目标执行器执行子事务。
第二执行单元,用于当执行器池中工作执行器的数量小于预设的最大阈值且不存在空闲执行器时,创建执行器作为目标执行器,以通过目标执行器执行子事务。
等待单元,用于当执行器池中工作执行器的数量等于预设的最大阈值时,进入等待执行状态,其中,等待执行状态在出现目标执行器时结束。
本实施例中,执行器池中的执行器存在数量管理策略,并基于该策略控制子事务的执行,确保了子事务的执行效率并可以控制执行器池的资源占用。
在本实施例的一些可选的实现方式中,事务执行模块304还可以包括:子事务确定子模块以及恢复回滚子模块,其中:
子事务确定子模块,用于当出现事务执行异常时,根据事务执行日志中的执行历史确定出现异常时执行的子事务。
恢复回滚子模块,用于根据持久子事务恢复子事务,并根据事务执行日志中的回滚参数对子事务进行回滚处理,以重新执行子事务。
本实施例中,当出现事务执行异常时,根据事务执行日志中的执行历史确定出现异常时执行的子事务,根据持久子事务恢复子事务,并根据事务执行日志中的回滚参数对子事务进行回滚处理,将子事务恢复至初始状态重新执行,以保证子事务执行的准确性。
为解决上述技术问题,本申请实施例还提供计算机设备。具体请参阅图4,图4为本实施例计算机设备基本结构框图。
所述计算机设备4包括通过系统总线相互通信连接存储器41、处理器42、网络接口43。需要指出的是,图中仅示出了具有组件41-43的计算机设备4,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。其中,本技术领域技术人员可以理解,这里的计算机设备是一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的设备,其硬件包括但不限于微处理器、专用集成电路(ApplicationSpecific Integrated Circuit,ASIC)、可编程门阵列(Field-Programmable GateArray,FPGA)、数字处理器 (Digital Signal Processor,DSP)、嵌入式设备等。
所述计算机设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述计算机设备可以与用户通过键盘、鼠标、遥控器、触摸板或声控设备等方式进行人机交互。
所述存储器41至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些实施例中,所述存储器41可以是所述计算机设备4的内部存储单元,例如该计算机设备4的硬盘或内存。在另一些实施例中,所述存储器41也可以是所述计算机设备4的外部存储设备,例如该计算机设备4上配备的插接式硬盘,智能存储卡(Smart Media Card, SMC),安全数字(Secure Digital, SD)卡,闪存卡(FlashCard)等。当然,所述存储器41还可以既包括所述计算机设备4的内部存储单元也包括其外部存储设备。本实施例中,所述存储器41通常用于存储安装于所述计算机设备4的操作系统和各类应用软件,例如基于saga的分布式事务处理方法的计算机可读指令等。此外,所述存储器41还可以用于暂时地存储已经输出或者将要输出的各类数据。
所述处理器42在一些实施例中可以是中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器42通常用于控制所述计算机设备4的总体操作。本实施例中,所述处理器42用于运行所述存储器41中存储的计算机可读指令或者处理数据,例如运行所述基于saga的分布式事务处理方法的计算机可读指令。
所述网络接口43可包括无线网络接口或有线网络接口,该网络接口43通常用于在所述计算机设备4与其他电子设备之间建立通信连接。
本实施例中提供的计算机设备可以执行上述基于saga的分布式事务处理方法。此处基于saga的分布式事务处理方法可以是上述各个实施例的基于saga的分布式事务处理方法。
本实施例中,获取分布式事务后,提取分布式事务的业务标识,业务标识可以反应分布式事务所进行的业务处理,根据业务标识对分布式事务进行加锁处理,可以避免重复请求对同一个操作对象进行多次重复处理,避免了幂等性要求所针对情况的发生,而无需对业务系统的每个环节都进行改造;事务工厂用于对基于saga的分布式事务进行定义与配置,根据事务工厂中的子事务列表,将分布式事务拆分为若干个子事务,按照子事务执行顺序执行各子事务,并在执行完毕后对分布式事务进行解锁处理,确保后续分布式事务的正常执行;当对各子事务执行成功时,得到分布式事务的事务处理结果;本申请通过加锁处理,减少了对已有业务系统的改造,简化了saga事务的幂等性实现。
本申请还提供了另一种实施方式,即提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可读指令,所述计算机可读指令可被至少一个处理器执行,以使所述至少一个处理器执行如上述的基于saga的分布式事务处理方法的步骤。
本实施例中,获取分布式事务后,提取分布式事务的业务标识,业务标识可以反应分布式事务所进行的业务处理,根据业务标识对分布式事务进行加锁处理,可以避免重复请求对同一个操作对象进行多次重复处理,避免了幂等性要求所针对情况的发生,而无需对业务系统的每个环节都进行改造;事务工厂用于对基于saga的分布式事务进行定义与配置,根据事务工厂中的子事务列表,将分布式事务拆分为若干个子事务,按照子事务执行顺序执行各子事务,并在执行完毕后对分布式事务进行解锁处理,确保后续分布式事务的正常执行;当对各子事务执行成功时,得到分布式事务的事务处理结果;本申请通过加锁处理,减少了对已有业务系统的改造,简化了saga事务的幂等性实现。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本申请各个实施例所述的方法。
显然,以上所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例,附图中给出了本申请的较佳实施例,但并不限制本申请的专利范围。本申请可以以许多不同的形式来实现,相反地,提供这些实施例的目的是使对本申请的公开内容的理解更加透彻全面。尽管参照前述实施例对本申请进行了详细的说明,对于本领域的技术人员来而言,其依然可以对前述各具体实施方式所记载的技术方案进行修改,或者对其中部分技术特征进行等效替换。凡是利用本申请说明书及附图内容所做的等效结构,直接或间接运用在其他相关的技术领域,均同理在本申请专利保护范围之内。

Claims (10)

1.一种基于saga的分布式事务处理方法,其特征在于,包括下述步骤:
当接收到事务处理请求时,获取分布式事务;
提取所述分布式事务的业务标识,以根据所述业务标识对所述分布式事务进行加锁处理;
获取事务工厂中的子事务列表,根据所述事务工厂中的子事务列表,将所述分布式事务拆分为若干个子事务,并获取子事务执行顺序,其中,所述事务工厂为对基于saga的分布式事务进行定义与配置的组件;
按照所述子事务执行顺序执行各子事务,并在执行完毕后对所述分布式事务进行解锁处理;
当对所述各子事务执行成功时,得到所述分布式事务的事务处理结果。
2.根据权利要求1所述的基于saga的分布式事务处理方法,其特征在于,在所述获取分布式事务的步骤之后,还包括:
确定所述分布式事务的数据量级别;
根据所述数据量级别选取saga组件,以基于所述saga组件执行所述提取所述分布式事务的业务标识,以根据所述业务标识对所述分布式事务进行加锁处理的步骤。
3.根据权利要求1所述的基于saga的分布式事务处理方法,其特征在于,所述提取所述分布式事务的业务标识的步骤包括:
根据所述分布式事务的事务类型,从所述分布式事务中提取预设类型字段,其中,所述预设类型字段包括事务主体标识和操作对象标识;
拼接提取到的事务主体标识和操作对象标识,得到所述分布式事务的业务标识。
4.根据权利要求1所述的基于saga的分布式事务处理方法,其特征在于,所述根据所述业务标识对所述分布式事务进行加锁处理的步骤包括:
查询所述业务标识所对应的分布式事务的事务状态;
当查询到所述事务状态为锁定状态时,丢弃所述分布式事务;
当未查询到所述事务状态时,对所述业务标识所对应的分布式事务进行加锁处理。
5.根据权利要求1所述的基于saga的分布式事务处理方法,其特征在于,所述按照所述子事务执行顺序执行各子事务的步骤包括:
对于所述子事务执行顺序中的每个子事务,对所述子事务进行持久化得到持久子事务;
通过执行器池中的执行器执行所述子事务,并对执行器的执行过程进行记录得到事务执行日志,其中,所述事务执行日志包括执行历史和回滚参数。
6.根据权利要求5所述的基于saga的分布式事务处理方法,其特征在于,所述通过执行器池中的执行器执行所述子事务的步骤包括:
当执行器池中存在空闲执行器时,在各空闲执行器中确定目标执行器,以通过所述目标执行器执行所述子事务;
当执行器池中工作执行器的数量小于预设的最大阈值且不存在空闲执行器时,创建执行器作为目标执行器,以通过所述目标执行器执行所述子事务;
当执行器池中工作执行器的数量等于预设的最大阈值时,进入等待执行状态,其中,所述等待执行状态在出现目标执行器时结束。
7.根据权利要求5所述的基于saga的分布式事务处理方法,其特征在于,在所述通过执行器池中的执行器执行所述子事务,并对执行器的执行过程进行记录得到事务执行日志的步骤之后,还包括:
当出现事务执行异常时,根据所述事务执行日志中的执行历史确定出现异常时执行的子事务;
根据所述持久子事务恢复所述子事务,并根据所述事务执行日志中的回滚参数对所述子事务进行回滚处理,以重新执行所述子事务。
8.一种基于saga的分布式事务处理装置,其特征在于,包括:
事务获取模块,用于当接收到事务处理请求时,获取分布式事务;
加锁处理模块,用于提取所述分布式事务的业务标识,以根据所述业务标识对所述分布式事务进行加锁处理;
事务拆分模块,用于获取事务工厂中的子事务列表,根据所述事务工厂中的子事务列表,将所述分布式事务拆分为若干个子事务,并获取子事务执行顺序,其中,所述事务工厂为对基于saga的分布式事务进行定义与配置的组件;
事务执行模块,用于按照所述子事务执行顺序执行各子事务,并在执行完毕后对所述分布式事务进行解锁处理;
结果生成模块,用于当对所述各子事务执行成功时,得到所述分布式事务的事务处理结果。
9.一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机可读指令,所述处理器执行所述计算机可读指令时实现如权利要求1至7中任一项所述的基于saga的分布式事务处理方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机可读指令,所述计算机可读指令被处理器执行时实现如权利要求1至7中任一项所述的基于saga的分布式事务处理方法的步骤。
CN202310035829.4A 2023-01-10 2023-01-10 基于saga的分布式事务处理方法、装置、设备及介质 Active CN115756768B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310035829.4A CN115756768B (zh) 2023-01-10 2023-01-10 基于saga的分布式事务处理方法、装置、设备及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310035829.4A CN115756768B (zh) 2023-01-10 2023-01-10 基于saga的分布式事务处理方法、装置、设备及介质

Publications (2)

Publication Number Publication Date
CN115756768A true CN115756768A (zh) 2023-03-07
CN115756768B CN115756768B (zh) 2023-04-28

Family

ID=85348942

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310035829.4A Active CN115756768B (zh) 2023-01-10 2023-01-10 基于saga的分布式事务处理方法、装置、设备及介质

Country Status (1)

Country Link
CN (1) CN115756768B (zh)

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100135179A1 (en) * 2008-11-28 2010-06-03 International Business Machines Corporation Communication device
CN107665143A (zh) * 2016-07-27 2018-02-06 华为技术有限公司 资源管理方法、装置及系统
CN108491252A (zh) * 2018-03-13 2018-09-04 万惠投资管理有限公司 分布式事务处理方法及分布式系统
CN111737300A (zh) * 2020-06-23 2020-10-02 北京同邦卓益科技有限公司 业务处理方法、装置、设备及计算机可读存储介质
CN112463290A (zh) * 2020-11-10 2021-03-09 中国建设银行股份有限公司 动态调整计算容器的数量的方法、系统、装置和存储介质
CN112835688A (zh) * 2021-02-01 2021-05-25 北京星网锐捷网络技术有限公司 分布式事务处理方法、设备及存储介质
CN114780177A (zh) * 2022-04-14 2022-07-22 青岛易来智能科技股份有限公司 事务执行方法及装置、存储介质及电子装置

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100135179A1 (en) * 2008-11-28 2010-06-03 International Business Machines Corporation Communication device
CN107665143A (zh) * 2016-07-27 2018-02-06 华为技术有限公司 资源管理方法、装置及系统
CN108491252A (zh) * 2018-03-13 2018-09-04 万惠投资管理有限公司 分布式事务处理方法及分布式系统
CN111737300A (zh) * 2020-06-23 2020-10-02 北京同邦卓益科技有限公司 业务处理方法、装置、设备及计算机可读存储介质
CN112463290A (zh) * 2020-11-10 2021-03-09 中国建设银行股份有限公司 动态调整计算容器的数量的方法、系统、装置和存储介质
CN112835688A (zh) * 2021-02-01 2021-05-25 北京星网锐捷网络技术有限公司 分布式事务处理方法、设备及存储介质
CN114780177A (zh) * 2022-04-14 2022-07-22 青岛易来智能科技股份有限公司 事务执行方法及装置、存储介质及电子装置

Also Published As

Publication number Publication date
CN115756768B (zh) 2023-04-28

Similar Documents

Publication Publication Date Title
CN109491801B (zh) 微服务访问调度方法、装置、介质及电子设备
CN106844014B (zh) 分布式事务防悬挂的实现方法和装置
US9448861B2 (en) Concurrent processing of multiple received messages while releasing such messages in an original message order with abort policy roll back
CN104065636B (zh) 数据处理方法和系统
CN110188110B (zh) 一种构建分布式锁的方法及装置
CN108829506A (zh) 批量任务处理方法、装置及服务系统
US9038093B1 (en) Retrieving service request messages from a message queue maintained by a messaging middleware tool based on the origination time of the service request message
CN113254445A (zh) 实时数据存储方法、装置、计算机设备及存储介质
JP5754301B2 (ja) トランザクション同時実行制御システム、トランザクション同時実行制御方法、およびプログラム
CN111752961A (zh) 一种数据处理方法及装置
CN112363814A (zh) 任务调度方法、装置、计算机设备及存储介质
CN112988348A (zh) 防重批量处理数据的方法、装置、系统及存储介质
CN111679892A (zh) 分布式事务的处理方法、装置、设备及介质
US9473561B2 (en) Data transmission for transaction processing in a networked environment
CN110222016B (zh) 一种文件处理方法及装置
EP3285179A1 (en) Data transfer method and device
CN117271122A (zh) 基于cpu和gpu分离的任务处理方法、装置、设备及存储介质
CN115756768B (zh) 基于saga的分布式事务处理方法、装置、设备及介质
CN111679895A (zh) 分布式定时任务的执行方法、装置、设备及可读存储介质
CN107632893B (zh) 消息队列处理方法及装置
CN116225630A (zh) 事务处理方法、装置、电子设备、存储介质及程序产品
CN116263717A (zh) 基于事件的订单业务处理方法及装置
CN114168626A (zh) 一种数据库操作的处理方法、装置、设备及介质
CN113254506A (zh) 数据处理方法、装置、计算机设备及存储介质
CN113112255A (zh) 分布式消息处理方法、装置、设备、介质和程序产品

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant