掌桥专利:专业的专利平台
掌桥专利
首页

基于zookeeper的事务实现方法及系统

文献发布时间:2023-06-19 11:39:06


基于zookeeper的事务实现方法及系统

技术领域

本发明涉及数据库事务技术领域,尤其涉及一种基于zookeeper的事务实现方法和一种基于zookeeper的事务实现系统。

背景技术

Zookeeper的存储结构是目录结构。为了保证业务数据的一致性,一些应用需要在一个原子操作中同时完成多个zookeeper目录的操作。

在Zookeeper的客户端API Curator包中,提供了一个打包函数,在一次调用中,可同时提交多个目录的修改,并且保证是原子性的。

但在现有技术中,zookeeper中不能应用于事务处理,而且,由于事务操作过程中对节点判断不准确,可能会出现数据不一致,还需要考虑数据反向操作的问题,业务操作繁琐。

发明内容

针对上述问题,本发明提供了一种基于zookeeper的事务实现方法及系统,通过对zookeeper进行封装设计形成类似数据库的事务操作函数集,支持事务的开始、事务中函数操作、事务提交、事务回滚操作,极大方便基于zookeeper多目录的操作,由于zookeeper的事务操作函数和节点操作封装函数的特性和功能,不会出现数据不一致,且业务不需要考虑数据反向操作,只需要调用回滚函数即可回滚所有历史操作,简化了业务操作过程,且同时支持事务和非事务类的操作,zookeeper的操作和业务其他函数可交叉进行,不影响事务操作。

为实现上述目的,本发明提供了一种基于zookeeper的事务实现方法,包括:对zookeeper进行封装形成支持事务的zookeeperWrapper操作类,所述操作类提供事务操作函数和节点操作封装函数;利用所述事务操作函数的beginTransaction函数启动事务;在事务处理过程中,利用所述节点操作封装函数按照缓存的zookeeper操作列表对目录节点进行操作;利用所述事务操作函数的commit函数将所述zookeeper操作列表中的所有操作作为入参提交至zookeeper;在事务处理过程中函数操作异常时,利用所述事务操作函数的回滚函数对所述zookeeper操作列表中的所有操作进行回滚操作。

在上述技术方案中,优选地,所述利用所述节点操作封装函数按照缓冲的zookeeper操作列表对目录节点进行操作具体包括:利用节点操作封装函数中的createNode函数、setData函数和/或deleteNode函数分别对目录节点进行添加、修改和/或删除操作。

在上述技术方案中,优选地,利用所述setData函数进行节点修改过程中:对所述zookeeper操作列表中最新加入的数据进行搜索,判断操作类型参数的记录值;若所述操作类型参数存在,判断记录值类型为DELETE或CREATE,若记录值类型为DELETE则调用CREATE执行创建节点操作,若记录值类型为CREATE则调用SET_DATA执行数据操作;若所述操作类型参数不存在,调用zookeeper的exists方法校验判断是否存在节点,若存在则调用SET_DATA执行数据操作,若不存在则调用CREATE执行创建节点操作。

在上述技术方案中,优选地,利用所述deleteNode函数进行节点删除过程中:调用addCuratorOp函数在所述zookeeper操作列表中增加操作类型为DELETE的操作。

在上述技术方案中,优选地,所述addCuratorOp函数对于操作路径相同、最近的操作连续出现的两次相同的CREATE或DELETE操作直接忽略不进行重复操作。

本发明还提出一种基于zookeeper的事务实现系统,应用如上述技术方案中任一项提出的基于zookeeper的事务实现方法,包括:操作类封装模块,用于对zookeeper进行封装形成支持事务的zookeeperWrapper操作类,所述操作类提供事务操作函数和节点操作封装函数;事务启动模块,用于利用所述事务操作函数的beginTransaction函数启动事务;节点操作模块,用于在事务处理过程中,利用所述节点操作封装函数按照缓存的zookeeper操作列表对目录节点进行操作;事务提交模块,用于利用所述事务操作函数的commit函数将所述zookeeper操作列表中的所有操作作为入参提交至zookeeper;操作回滚模块,用于在事务处理过程中函数操作异常时,利用所述事务操作函数的回滚函数对所述zookeeper操作列表中的所有操作进行回滚操作。

在上述技术方案中,优选地,所述节点操作模块具体用于:利用节点操作封装函数中的createNode函数、setData函数和/或deleteNode函数分别对目录节点进行添加、修改和/或删除操作。

在上述技术方案中,优选地,所述节点操作模块的节点修改过程具体包括:对所述zookeeper操作列表中最新加入的数据进行搜索,判断操作类型参数的记录值;若所述操作类型参数存在,判断记录值类型为DELETE或CREATE,若记录值类型为DELETE则调用CREATE执行创建节点操作,若记录值类型为CREATE则调用SET_DATA执行数据操作;若所述操作类型参数不存在,调用zookeeper的exists方法校验判断是否存在节点,若存在则调用SET_DATA执行数据操作,若不存在则调用CREATE执行创建节点操作。

在上述技术方案中,优选地,所述节点操作模块的节点删除过程具体包括:调用addCuratorOp函数在所述zookeeper操作列表中增加操作类型为DELETE的操作。

在上述技术方案中,优选地,所述节点删除过程中,所述addCuratorOp函数对于操作路径相同、最近的操作连续出现的两次相同的CREATE或DELETE操作直接忽略不进行重复操作。

与现有技术相比,本发明的有益效果为:通过对zookeeper进行封装设计形成类似数据库的事务操作函数集,支持事务的开始、事务中函数操作、事务提交、事务回滚操作,极大方便基于zookeeper多目录的操作,由于zookeeper的事务操作函数和节点操作封装函数的特性和功能,不会出现数据不一致,且业务不需要考虑数据反向操作,只需要调用回滚函数即可回滚所有历史操作,简化了业务操作过程,且同时支持事务和非事务类的操作,zookeeper的操作和业务其他函数可交叉进行,不影响事务操作。

附图说明

图1为本发明一种实施例公开的基于zookeeper的事务实现方法的正向操作流程示意图;

图2为本发明一种实施例公开的基于zookeeper的事务实现方法的反向操作示意图;

图3为本发明一种实施例公开的基于zookeeper的事务实现系统的模块示意图。

图中,各组件与附图标记之间的对应关系为:

11.操作类封装模块,12.事务启动模块,13.节点操作模块,14.事务提交模块,15.操作回滚模块。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

下面结合附图对本发明做进一步的详细描述:

如图1和图2所示,根据本发明提供的一种基于zookeeper的事务实现方法,包括:对zookeeper进行封装形成支持事务的zookeeperWrapper操作类,操作类提供事务操作函数和节点操作封装函数;利用事务操作函数的beginTransaction函数启动事务;在事务处理过程中,利用节点操作封装函数按照缓存的zookeeper操作列表对目录节点进行操作;利用事务操作函数的commit函数将zookeeper操作列表中的所有操作作为入参提交至zookeeper;在事务处理过程中函数操作异常时,利用事务操作函数的回滚函数对zookeeper操作列表中的所有操作进行回滚操作。

在该实施例中,通过对zookeeper进行封装设计形成类似数据库的事务操作函数集,支持事务的开始、事务中函数操作、事务提交、事务回滚操作,极大方便基于zookeeper多目录的操作,由于zookeeper的事务操作函数和节点操作封装函数的特性和功能,不会出现数据不一致,且业务不需要考虑数据反向操作,只需要调用回滚函数即可回滚所有历史操作,简化了业务操作过程,且同时支持事务和非事务类的操作,zookeeper的操作和业务其他函数可交叉进行,不影响事务操作。

具体地,首先对zookeeper进行封装,形成支持事务的ZookeeperWrapper操作类,在该操作类中,包括内部成员变量isInTransaction和zkOps,其中,

(1)isInTransaction:boolean类型,事务控制变量,用于表示当前是否处于事务处理中;

(2)zkOps:List类型,缓冲的zookeeper操作列表。

ZookeeperWrapper操作类还提供如下事务操作函数:

(1)beginTransaction:启动事务。内部把isInTransaction设置为true,表示处于事务操作中;

(2)rollback:回滚事务。内部清理缓存的zookeeper操作zkOps,同时把isInTransaction设置为false,表示处于处于非事务操作中;

(3)commit:提交事务。内部把缓冲的所有zookeeper操作(zkOps)作为入参传递给Curator包的forOperations函数,由此函数统一提交给zookeeper,确保事务的原子性。

此外,ZookeeperWrapper操作类还提供节点操作封装函数,在这些函数中需要判断是否处于事务中,如果在事务中,则需要把zookeeper操作缓存到zkOps中,否则直接对zookeeper操作即可,目录节点的修改函数如下:

(1)createNode:添加节点;调用addCuratorOp函数,在zkOps中增加一个类型为OperationType.CREATE类型的操作;

(2)setData:修改节点;由于事务缓存的原因,当调用setData函数时,可能设置的目录节点已经存在,也有可能不存在,当存在时需要添加一个OperationType.SET_DATA类型的操作,当目录节点不存在时,则添加一个类型为OperationType.CREATE类型的操作;判断路径是否存在的规则如下:

从zkOps最新加入的数据开始搜索,搜索OperationType为DELETE和CREATE的记录,

A.如果存在记录,有两种情况:OperationType为DELETE时,表示目录节点已经被删除,需要调用类型为CREATE的创建目录方法;如果类型为CREATE时,表示目录节点已经被创建,则需要调用类型为SET_DATA类型的操作;

B.如果不存在记录,调用zookeeper的exists方法校验判断是否存在目录节点,存在调用类型为SET_DATA类型的操作,否则调用类型为CREATE的方法;

(3)deleteNode:删除节点;调用addCuratorOp函数,在zkOps中增加一个类型为OperationType.DELETE类型的操作;

addCuratorOp:增加一个zookeeper操作。此函数是内部封装函数,被createNode、setData和deleteNode函数调用,作用是做一些剔重操作,忽略最新相同的create和delete节点操作,确保相同的操作不会向zookeeper提交两次,否则zookeeper汇报主键冲突;

具体实现过程为:把传递进来的CuratorOp入参和缓冲起来的zkOps列表中的CuratorOp细项做比较,存在下面的情况就认为是重复操作,直接忽略:

如果zk的操作路径curatorOp.forPath相同,并且最近的操作连续出现两次相同的CREATE或DELETE操作,并且连续两次出现的CREATE操作不是zookeeper的临时目录操作(CreateMode.isSequential为false)。

在上述实施例中,优选地,利用节点操作封装函数按照缓冲的zookeeper操作列表对目录节点进行操作具体包括:利用节点操作封装函数中的createNode函数、setData函数和/或deleteNode函数分别对目录节点进行添加、修改和/或删除操作。

在上述实施例中,优选地,利用setData函数进行节点修改过程中:对zookeeper操作列表中最新加入的数据进行搜索,判断操作类型参数的记录值;若操作类型参数存在,判断记录值类型为DELETE或CREATE,若记录值类型为DELETE则调用CREATE执行创建节点操作,若记录值类型为CREATE则调用SET_DATA执行数据操作;若操作类型参数不存在,调用zookeeper的exists方法校验判断是否存在节点,若存在则调用SET_DATA执行数据操作,若不存在则调用CREATE执行创建节点操作。

在上述实施例中,优选地,利用deleteNode函数进行节点删除过程中:调用addCuratorOp函数在zookeeper操作列表中增加操作类型为DELETE的操作。

在上述实施例中,优选地,addCuratorOp函数对于操作路径相同、最近的操作连续出现的两次相同的CREATE或DELETE操作直接忽略不进行重复操作。

如图3所示,本发明还提出一种基于zookeeper的事务实现系统,应用如上述实施例中任一项提出的基于zookeeper的事务实现方法,包括:操作类封装模块11,用于对zookeeper进行封装形成支持事务的zookeeperWrapper操作类,操作类提供事务操作函数和节点操作封装函数;事务启动模块12,用于利用事务操作函数的beginTransaction函数启动事务;节点操作模块13,用于在事务处理过程中,利用节点操作封装函数按照缓存的zookeeper操作列表对目录节点进行操作;事务提交模块14,用于利用事务操作函数的commit函数将zookeeper操作列表中的所有操作作为入参提交至zookeeper;操作回滚模块15,用于在事务处理过程中函数操作异常时,利用事务操作函数的回滚函数对zookeeper操作列表中的所有操作进行回滚操作。

在上述实施例中,优选地,节点操作模块具体用于:利用节点操作封装函数中的createNode函数、setData函数和/或deleteNode函数分别对目录节点进行添加、修改和/或删除操作。

在上述实施例中,优选地,节点操作模块13的节点修改过程具体包括:对zookeeper操作列表中最新加入的数据进行搜索,判断操作类型参数的记录值;若操作类型参数存在,判断记录值类型为DELETE或CREATE,若记录值类型为DELETE则调用CREATE执行创建节点操作,若记录值类型为CREATE则调用SET_DATA执行数据操作;若操作类型参数不存在,调用zookeeper的exists方法校验判断是否存在节点,若存在则调用SET_DATA执行数据操作,若不存在则调用CREATE执行创建节点操作。

在上述实施例中,优选地,节点操作模块13的节点删除过程具体包括:调用addCuratorOp函数在zookeeper操作列表中增加操作类型为DELETE的操作。

在上述实施例中,优选地,节点删除过程中,addCuratorOp函数对于操作路径相同、最近的操作连续出现的两次相同的CREATE或DELETE操作直接忽略不进行重复操作。

根据上述实施例提出的基于zookeeper的事务实现方法及系统,在实施过程中,利用beginTransaction操作作为事务操作的起始函数,用来启动事务,保证后续的createNode、deleteNode和setData等系列zookeeper函数操作都处于事务操作中。以commit操作作为事务的最后一个函数,用来一次提交之前的所有的zookeeper操作,确保是原子性的。当在beginTransaction和commit之间的函数操作出现异常时(包括zookeeper的函数操作和业务侧的操作),调用rollback函数回滚之前事务中的所有zookeeper操作。

以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 基于zookeeper的事务实现方法及系统
  • 基于Zookeeper的节点配置方法和基于Zookeeper的节点配置系统
技术分类

06120113008414