基于zookeeper的共享资源访问方法、客户端、服务端、系统与流程

文档序号:14443833阅读:257来源:国知局
基于zookeeper的共享资源访问方法、客户端、服务端、系统与流程

本发明涉及计算机技术领域,尤其涉及一种基于zookeeper的共享资源访问方法、客户端、服务端、系统。



背景技术:

在分布式系统中,常常需要协调各个系统之间的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。

现有的基于数据库实现的分布式锁,其实现方法如下:在数据库中创建一张表,该表至少包含有具有唯一约束性质的“资源名称”字段,当要锁住某个方法或资源时,就在该表中增加一条记录,想要释放锁的时候就删除这条记录。

由于对“资源名称”做了唯一性约束,这里如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作可以成功,那么就可以认为操作成功的那个线程获得了该方法的锁,可以执行方法体内容。

发明人在实施本发明的过程中发明:现有技术至少存在如下缺点:

1、这把锁强依赖数据库的可用性,数据库是一个单点,一旦数据库挂掉,会导致业务系统不可用。

2、这把锁没有失效时间,一旦解锁操作失败,就会导致锁记录一直在数据库中,其他线程无法再获得到锁。

3、这把锁只能是非阻塞的,因为数据的insert操作,一旦插入失败就会直接报错。没有获得锁的线程并不会进入排队队列,要想再次获得锁就要再次触发获得锁操作。

4、这把锁是非重入的,同一个线程在没有释放锁之前无法再次获得该锁。因为数据库中数据已经存在了。



技术实现要素:

针对上述问题,本发明的目的在于提供一种基于zookeeper的共享资源访问方法、客户端、服务端、系统,可有效的解决单点问题,不可重入问题,非阻塞问题以及锁无法释放的问题,锁安全性高,并且可以持久化。

本发明实施例提供了一种基于zookeeper的共享资源访问方法,包括如下步骤:

在向服务端发起对预定资源的访问请求时,在与该资源对应的目录下创建对应的唯一的瞬时有序节点;其中,所述瞬时有序节点包括节点序号;

获取所述服务端发送的目录下的所有瞬时有序节点的变化;

当根据所述变化判断自身的瞬时有序节点的节点序号最小时,向所述服务端获取锁,以获得访问所述资源的权限。

优选地,所述瞬时有序节点的类型为ephemeral_sequential类型;所述瞬时有序节点的节点名后自动生成单调递增的节点序号。

优选地,所述瞬时有序节点写入有客户端自身的主机信息和线程信息,以实现重入。

本发明实施例还提供了一种基于zookeeper的共享资源访问方法,包括如下步骤:

获取客户端对预定资源发起访问请求时,在与该资源对应的目录下创建的与所述客户端对应的唯一的瞬时有序节点;其中,所述瞬时有序节点包括节点序号;

监听在所述目录下的所有瞬时有序节点的变化,并将所述变化发送给所述客户端,以使得所述客户端在判断自身的瞬时有序节点的节点序号为最小序号时,获取锁,以拥有访问所述资源的权限;

在检测到与所述客户端的会话失效或者连接关闭后,删除与所述客户端对应的瞬时有序节点,并释放所述锁。

优选地,还包括:

创建与所述资源对应的用于存放瞬时有序节点的目录。

本发明实施例还提供了一种基于zookeeper的客户端,包括:

节点创建单元,用于在向服务端发起对预定资源的访问请求时,在与该资源对应的目录下创建对应的唯一的瞬时有序节点;其中,所述瞬时有序节点包括节点序号;

变化获取单元,用于获取所述服务端发送的瞬时有序节点的变化;

锁获取单元,用于当根据所述变化判断自身的瞬时有序节点的节点序号最小时,向所述服务端获取锁,以获得访问所述资源的权限。

优选地,所述瞬时有序节点的类型为ephemeral_sequential类型;所述瞬时有序节点的节点名后自动生成单调递增的节点序号。

本发明实施例还提供了一种基于zookeeper的服务端,包括:

节点获取单元,用于获取客户端对预定资源发起访问请求时,在与该资源对应的目录下创建的与所述客户端对应的唯一的瞬时有序节点;

节点监听单元,用于监听在所述目录下的所有瞬时有序节点的变化,并将所述变化发送给所述客户端,以使得所述客户端在判断自身的瞬时有序节点的节点序号为最小序号时,获取锁,以拥有访问所述资源的权限;

节点删除单元,用于在检测到与所述客户端的会话失效或者连接关闭后,删除与所述客户端对应的瞬时有序节点,并释放所述锁。

优选地,还包括:

目录创建单元,用于创建与所述资源对应的用于存放瞬时有序节点的目录。

本发明实施例还提供了一种基于zookeeper的共享资源访问系统,包括服务端以及至少一个客户端;

所述客户端,用于在向服务端发起对预定资源的访问请求时,在与该资源对应的目录下创建对应的唯一的瞬时有序节点;其中,所述瞬时有序节点包括节点序号;

所述服务端,用于监听在所述目录下的所有瞬时有序节点的变化,并将所述变化发送给所述客户端;

所述客户端,还用于根据所述变化判断自身的瞬时有序节点的节点序号是否为最小序号时,并在判断为是时,获取锁,以拥有访问所述资源的权限;

所述服务端,还用于在检测到与所述客户端的会话失效或者连接关闭后,删除与所述客户端对应的瞬时有序节点,并释放所述锁。

本发明实施例提供的基于zookeeper的共享资源访问方法、服务端、客户端及系统,具有如下优点:

1、本发明实施例在目录下创建一个瞬时有序节点,不需要依赖数据库,解决了数据库的单点问题;

2、本发明实施例的锁是可以重入的,只需要瞬时有序节点存在,即可以重入访问资源;

3、本发明实施例在会话失效或者连接关闭后即自动删除该节点,并释放锁,因此可以避免服务宕机导致的锁无法释放而产生的死锁问题。

4、本发明实施例解决了非阻塞问题,没有获得锁的线程可以进入排队队列(表现为生成一个瞬时有序节点进行排队),不需再次触发获得锁操作。

附图说明

为了更清楚地说明本发明的技术方案,下面将对实施方式中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明第一实施例提供的基于zookeeper的共享资源访问方法的流程示意图。

图2是本发明第二实施例提供的基于zookeeper的共享资源访问方法的流程示意图。

图3是本发明第三实施例提供的基于zookeeper的客户端的结构示意图。

图4是本发明第四实施例提供的基于zookeeper的服务端的结构示意图。

具体实施方式

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

本发明实施例提供了一种在分布式系统环境下的基于zookeeper的共享资源访问方法、装置、服务端、客户端以及系统,用于实现分布式环境下的共享资源的访问管理,以下分别进行描述。

请参阅图1,本发明第一实施例提供了一种基于zookeeper的共享资源访问方法,其从客户端出发,并至少包括如下步骤:

s101,在向服务端发起对预定资源的访问请求时,在所述服务端的与该资源对应的目录下创建唯一的瞬时有序节点;其中,所述瞬时有序节点包括节点序号。

在本实施例中,在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。

在本实施例中,基于分布式系统的服务端上可放置共享资源,不同的客户端可以访问这些共享资源。其中,所述服务端为基于zookeeper的服务端。所述资源包括功能、方法、数据等。

在本实施例中,所述客户端在向服务端发起对预定资源的访问请求时(或者理解为对某个功能进行加锁),会在与该资源对应的目录下创建对应的唯一的瞬时有序节点。其中,所述瞬时有序节点的类型为ephemeral_sequential类型,其属于临时顺序节点,在所述客户端会话失效或连接关闭后,该节点会被自动删除,且不能在临时节点下面创建子节点,创建节点的过程中,会在其节点名字后自动追加一个单调增长的数字后缀,作为其节点序号。

此外,在创建所述节点时,所述客户端在会在所述节点内写入所述客户端的主机信息以及线程信息。

s102,获取所述服务端发送的目录下的所有瞬时有序节点的变化。

在本实施例中,客户端可对所述节点绑定一个监听器,节点的变化可通过监听器监听得到。一旦节点发生变化(如某个节点被删除),服务端会通知客户端。

具体地,服务端会对所述目录的所有瞬时有序节点根据其节点序号从小到大进行排序,当排列在前面的节点被删除后,所述服务端检测到这个删除操作,生成相应的变化,并将这个变化发送给所述客户端。

s103,当根据所述变化判断自身的瞬时有序节点的节点序号最小时,向所述服务端获取锁,以获得访问所述资源的权限。

在本实施例中,客户端根据所述服务端发送的变化可以检查自己创建的节点是不是当前所有节点中节点序号最小的节点,如果是,那么客户端就获取到锁。

在本实施例中,客户端在获取了所述锁后,即拥有了访问操作所述资源的权限,客户端可以对所述资源进行权限范围内的操作。其中,客户端在因退出访问而导致会话失效或者因网络问题断开导致与服务端的连接断开或者关闭后,所述服务端删除与所述客户端对应的瞬时有序节点,并释放锁,从而下一个瞬时有序节点对应的客户端可以获取锁,进而获得访问资源的权限。

综上所述,本发明实施例提供的基于zookeeper的共享资源访问方法与现有技术相比,具有如下优点:

1、本实施例在目录下创建一个瞬时有序节点,不需要依赖数据库,解决了数据库的单点问题;

2、本实施例的锁是可以重入的,客户端在创建节点的时候,把当前客户端的主机信息和线程信息直接写入到节点中,下次想要获取锁的时候和当前最小的节点中的数据比对一下就可以了。如果和自己的信息一样,那么就可以直接获取到锁,如果不一样就再创建一个节点,参与排队。

3、本实施例在会话失效或者连接关闭后即自动删除该节点,并释放锁,因此可以避免服务宕机导致的锁无法释放而产生的死锁问题。

4、本实施例解决了非阻塞问题,没有获得锁的线程可以进入排队队列(表现为生成一个瞬时有序节点进行排队),不需再次触发获得锁操作。

请参阅图2,本发明第二实施例提供了一种基于zookeeper的共享资源访问方法,其从服务端出发,并至少包括如下步骤:

s201,获取客户端对预定资源发起访问请求时,在与该资源对应的目录下创建的与所述客户端对应的唯一的瞬时有序节点;其中,所述瞬时有序节点包括节点序号。

其中,所述服务端会首先创建与所述资源对应的用于存放瞬时有序节点的目录。例如,可为dislocks目录。

s202,监听在所述目录下的所有瞬时有序节点的变化,并将所述变化发送给所述客户端,以使得所述客户端在判断自身的瞬时有序节点的节点序号为最小序号时,获取锁,以拥有访问所述资源的权限。

s203,在检测到与所述客户端的会话失效或者连接关闭后,删除与所述客户端对应的瞬时有序节点,并释放所述锁。

本发明实施例提供的基于zookeeper的共享资源访问方法与现有技术相比,具有如下优点:

1、本实施例在目录下创建一个瞬时有序节点,不需要依赖数据库,解决了数据库的单点问题;

2、本实施例的锁是可以重入的,客户端在创建节点的时候,把当前客户端的主机信息和线程信息直接写入到节点中,下次想要获取锁的时候和当前最小的节点中的数据比对一下就可以了。如果和自己的信息一样,那么就可以直接获取到锁,如果不一样就再创建一个节点,参与排队。

3、本实施例在会话失效或者连接关闭后即自动删除该节点,并释放锁,因此可以避免服务宕机导致的锁无法释放而产生的死锁问题。

4、本实施例解决了非阻塞问题,没有获得锁的线程可以进入排队队列(表现为生成一个瞬时有序节点进行排队),不需再次触发获得锁操作。

请参阅图3,图3是本发明第三实施例提供的基于zookeeper的客户端的结构示意图,其包括:

节点创建单元310,用于在向服务端发起对预定资源的访问请求时,在与该资源对应的目录下创建对应的唯一的瞬时有序节点;其中,所述瞬时有序节点包括节点序号;

变化获取单元320,用于获取所述服务端发送的瞬时有序节点的变化;

锁获取单元330,用于当根据所述变化判断自身的瞬时有序节点的节点序号最小时,向所述服务端获取锁,以获得访问所述资源的权限。

其中,所述瞬时有序节点的类型为ephemeral_sequential类型;所述瞬时有序节点的节点名后自动生成单调递增的节点序号。

请参阅图4,图4是本发明第四实施例提供的基于zookeeper的服务端的结构示意图,其包括:

节点获取单元410,用于获取客户端对预定资源发起访问请求时,在与该资源对应的目录下创建的与所述客户端对应的唯一的瞬时有序节点;

节点监听单元420,用于监听在所述目录下的所有瞬时有序节点的变化,并将所述变化发送给所述客户端,以使得所述客户端在判断自身的瞬时有序节点的节点序号为最小序号时,获取锁,以拥有访问所述资源的权限;

节点删除单元430,用于在检测到与所述客户端的会话失效或者连接关闭后,删除与所述客户端对应的瞬时有序节点,并释放所述锁。

优选地,还包括:

目录创建单元,用于创建与所述资源对应的用于存放瞬时有序节点的目录。

本发明第五实施例还提供的一种基于zookeeper的共享资源访问系统,其包括服务端以及至少一个客户端;

所述客户端,用于在向服务端发起对预定资源的访问请求时,在与该资源对应的目录下创建对应的唯一的瞬时有序节点;其中,所述瞬时有序节点包括节点序号;

所述服务端,用于监听在所述目录下的所有瞬时有序节点的变化,并将所述变化发送给所述客户端;

所述客户端,还用于根据所述变化判断自身的瞬时有序节点的节点序号是否为最小序号时,并在判断为是时,获取锁,以拥有访问所述资源的权限;

所述服务端,还用于在检测到与所述客户端的会话失效或者连接关闭后,删除与所述客户端对应的瞬时有序节点,并释放所述锁。

本发明实施例提供的基于zookeeper的共享资源访问系统与现有技术相比,具有如下优点:

1、本实施例在目录下创建一个瞬时有序节点,不需要依赖数据库,解决了数据库的单点问题;

2、本实施例的锁是可以重入的,客户端在创建节点的时候,把当前客户端的主机信息和线程信息直接写入到节点中,下次想要获取锁的时候和当前最小的节点中的数据比对一下就可以了。如果和自己的信息一样,那么就可以直接获取到锁,如果不一样就再创建一个节点,参与排队。

3、本实施例在会话失效或者连接关闭后即自动删除该节点,并释放锁,因此可以避免服务宕机导致的锁无法释放而产生的死锁问题。

4、本实施例解决了非阻塞问题,没有获得锁的线程可以进入排队队列(表现为生成一个瞬时有序节点进行排队),不需再次触发获得锁操作。

以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于发明所涵盖的范围。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1