一种基于分布式锁加载分布式任务的方法以及装置与流程

文档序号:11276135阅读:215来源:国知局
一种基于分布式锁加载分布式任务的方法以及装置与流程

本申请涉及分布式系统技术领域,具体涉及一种基于分布式锁加载分布式任务的方法。本申请同时涉及一种基于分布式锁加载分布式任务的装置。



背景技术:

随着计算机技术和网络技术的不断发展,计算机系统的规模变得越来越大,传统的集中式系统已经无法满足用户对计算机系统的需求,各种系统架构模型层出不穷,分布式系统架构应运而生,zookeeper(典型的分布式数据一致性解决方案)作为一个分布式的、开放源码的分布式应用程序协调服务,供了高效且可靠的分布式协调服务,诸如命名统一服务、配置管理和分布式锁等基础服务,得到了广泛的应用,尤其是分布式锁服务得到了广泛的应用,分布式锁是控制分布式系统之间同步访问共享资源的一种方式;对于不同的系统或者同一系统的不同主机之间共享一个或一组资源,在访问这些资源的时候,往往需要一些互斥手段(如分布式锁)来防止彼此之间的干扰,以保证数据的一致性。

对于分布式系统的机器集群中的机器,需要加载自身应当执行的任务,在加载任务的过程中,还应当保证不能重复加载或者漏加载任务。尤其是对于一些高可用性要求比较高的分布式系统,比如分布式系统的监控场景下,由于加载的任务是用于监控,因此,任务初始化加载和增量任务的加载的速度要尽可能的快,以保证监控服务的及时性。

目前,现有技术在加载分布式任务时,基于zookeeper实现分布式系统的机器集群的管理,采用master-slave(管理者-追随者)模式,用zookeeper实现一个互斥的分布式锁,机器集群中各机器在启动时,争抢所述分布式锁,争抢所述分布式锁成功的机器成为机器集群中的master(管理者),未争抢到所述分布式锁的机器为slave(追随者);在加载任务时,由master(管理者)从数据库或相应服务中进行任务加载,同时,master(管理者)从zookeeper获取所有slave(追随者)的列表,按照预设的分配规则将加载的任务分配给各个slave(追随者),由各个slave(追随者)将任务加载到自身对应的机器上执行。

上述现有技术提供的方法存在明显的缺陷。

现有技术采用master-slave(管理者-追随者)模式,在任务初始化加载时,master(管理者)不可避免的需要加载全部的任务,如果分布式系统中slave(追随者)的数目为n,并且任务分配是均匀的情况下,一台slave(追随者)加载分配给自身的任务的时间是t,则master(管理者)加载所有的任务需要耗时n*t,随着分布式系统中任务量的增加,以及机器集群中机器数的增加,加载任务的时间会大大增加,导致任务加载耗时较长,会出现任务加载不及时或者加载延时较长情况,无法满足实际应用中的分布式系统对高可用性的要求,存在一定的缺陷。



技术实现要素:

本申请提供一种基于分布式锁加载分布式任务的方法,以解决现有技术的存在的加载分布式任务耗时较长的问题。

本申请同时涉及一种基于分布式锁加载分布式任务的装置。

本申请提供一种基于分布式锁加载分布式任务的方法,包括:

工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息;

根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务;

设置未抢占到所述分布式锁的机器为备机。

可选的,所述工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息步骤执行之前,执行如下步骤:

分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁;每个分布式锁只能被一台机器抢占;

针对n+m台所述机器中的每一台机器,判断所述机器是否成功抢占所述分布式锁;

若是,设置成功抢占所述分布式锁的机器为所述工作机,并执行所述工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息步骤;

若否,返回执行所述分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁步骤。

可选的,所述任务配置信息,包括:

所述分布式锁的数目n和所述分布式锁各自的锁标识;

其中,所述分布式锁的锁标识小于所述分布式锁的数目n,且大于等于0。

可选的,所述分布式任务记录在所述任务数据库的数据表中,所述数据表的主键包括:与所述分布式任务一一对应的任务标识;

每个任务标识所在的记录用于记录一个分布式任务。

可选的,所述根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务步骤,包括:

根据所述分布式锁的数目n和成功抢占所述分布式锁的工作机的机器标识,确定所述工作机的任务筛选条件;

在所述数据表中查找满足所述工作机的任务筛选条件的分布式任务,作为所述工作机对应的分布式任务;

将查找到的所述分布式任务分别加载到各自对应的所述工作机上。

可选的,所述任务筛选条件,包括:

所述任务标识对所述分布式锁的数目n取模,得到的值等于所述工作机的机器标识的分布式任务;

其中,所述工作机的机器标识,由所述工作机抢占的分布式锁的锁标识确定。

可选的,所述主键为自增主键,且所述任务标识之间按照预设间隔阈值顺序排列。

可选的,所述分布式系统是基于zookeeper实现;

相应的,所述分布式锁,采用如下方式实现:

所述zookeeper上的n个数据节点;

其中,所述n个数据节点中的每一个数据节点下,存储所述数据节点代表的分布式锁的任务配置信息。

可选的,所述分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁,采用如下方式实现:

n+m台所述机器在所述zookeeper上的n个数据节点下,创建临时子节点,成功在所述数据节点下创建所述临时子节点的机器成功抢占所述数据节点代表的分布式锁。

可选的,所述基于分布式锁加载分布式任务的方法,包括:

所述备机通过在所述zookeeper上的n个数据节点下注册监听节点,来监听所述分布式锁。

可选的,所述备机通过在所述zookeeper上的n个数据节点下注册监听节点,来监听所述分布式锁步骤执行之后,执行下述步骤:

获取一台或者多台工作机发生宕机的机器状态信息;

基于zookeeper删除所述机器状态信息各自对应的工作机的数据节点下创建的临时子节点。

可选的,所述基于zookeeper删除所述机器状态信息各自对应的工作机的数据节点下创建的临时子节点步骤执行之后,执行下述步骤:

若所述备机监听到所述数据节点下创建的临时子节点被删除,则所述备机通过在临时子节点被删除的数据节点下创建临时子节点,抢占所述临时子节点被删除的数据节点代表的分布式锁。

可选的,所述针对n+m台所述机器中的每一台机器,判断所述机器是否成功抢占所述分布式锁步骤执行之后,且所述工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息步骤执行之前,执行下述步骤:

判断所述工作机是否失去已抢占的分布式锁;

若是,返回执行所述分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁步骤;

若否,在等待预设的时间间隔后,返回执行所述判断所述工作机是否失去已抢占的分布式锁步骤。

可选的,所述工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息步骤执行之后,且所述根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务步骤执行之前,执行下述步骤:

获取所述工作机前一次加载对应的分布式任务的历史时间信息;

判断在所述历史时间信息至当前时间点的时间间隔内,所述任务数据库中是否有所述工作机对应的分布式任务产生;

若是,则执行所述根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务步骤;

若否,则在等待预设的时间间隔后,返回执行所述获取所述工作机前一次加载对应的分布式任务的历史时间信息步骤,和所述判断在所述历史时间信息至当前时间点的时间间隔内,所述任务数据库中是否有所述工作机对应的分布式任务产生步骤。

可选的,所述根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务步骤执行之后,执行下述步骤:

判断所述工作机对应的分布式任务是否加载成功;

若是,返回执行所述获取所述工作机前一次加载对应的分布式任务的历史时间信息步骤,和所述判断在所述历史时间信息至当前时间点的时间间隔内,所述任务数据库中是否有所述工作机对应的分布式任务产生步骤;

若否,返回执行所述根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务步骤。

本申请另外提供一种基于分布式锁加载分布式任务的装置,包括:

任务配置信息读取单元,工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息;

分布式任务加载单元,用于根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务;

备机设置单元,用于设置未抢占到所述分布式锁的机器为备机。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

分布式锁争抢单元,用于分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁;每个分布式锁只能被一台机器抢占;

针对n+m台所述机器中的每一台机器,运行分布式锁抢占判断单元,所述分布式锁抢占判断单元,用于判断所述机器是否成功抢占所述分布式锁;

若是,运行工作机设置单元和所述任务配置信息读取单元;

所述工作机设置单元,用于设置成功抢占所述分布式锁的机器为所述工作机;

若否,运行所述分布式锁争抢单元。

可选的,所述任务配置信息,包括:

所述分布式锁的数目n和所述分布式锁各自的锁标识;

其中,所述分布式锁的锁标识小于所述分布式锁的数目n,且大于等于0。

可选的,所述分布式任务记录在所述任务数据库的数据表中,所述数据表的主键包括:与所述分布式任务一一对应的任务标识;

每个任务标识所在的记录用于记录一个分布式任务。

可选的,所述分布式任务加载单元,包括:

任务筛选条件确定子单元,用于根据所述分布式锁的数目n和成功抢占所述分布式锁的工作机的机器标识,确定所述工作机的任务筛选条件;

分布式任务查找子单元,用于在所述数据表中查找满足所述工作机的任务筛选条件的分布式任务,作为所述工作机对应的分布式任务;

分布式任务加载子单元,用于将查找到的所述分布式任务分别加载到各自对应的所述工作机上。

可选的,所述分布式系统是基于zookeeper实现;

相应的,所述分布式锁,采用如下方式实现:

所述zookeeper上的n个数据节点;

其中,所述n个数据节点中的每一个数据节点下,存储所述数据节点代表的分布式锁的任务配置信息。

可选的,所述分布式锁争抢单元,具体用于n+m台所述机器在所述zookeeper上的n个数据节点下,创建临时子节点,成功在所述数据节点下创建所述临时子节点的机器成功抢占所述数据节点代表的分布式锁。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

监听节点注册单元,用于所述备机通过在所述zookeeper上的n个数据节点下注册监听节点,来监听所述分布式锁。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

机器状态信息获取单元,用于获取一台或者多台工作机发生宕机的机器状态信息;

临时子节点删除单元,用于基于zookeeper删除所述机器状态信息各自对应的工作机的数据节点下创建的临时子节点。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

第二分布式锁争抢单元,用于在所述备机监听到所述数据节点下创建的临时子节点被删除时,所述备机通过在临时子节点被删除的数据节点下创建临时子节点,抢占所述临时子节点被删除的数据节点代表的分布式锁。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

分布式锁轮询单元,用于判断所述工作机是否失去已抢占的分布式锁;

若是,运行所述分布式锁争抢单元;

若否,在等待预设的时间间隔后,运行所述分布式锁轮询单元。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

历史时间信息获取单元,用于获取所述工作机前一次加载对应的分布式任务的历史时间信息;

分布式任务轮询单元,用于判断在所述历史时间信息至当前时间点的时间间隔内,所述任务数据库中是否有所述工作机对应的分布式任务产生;

若是,运行所述分布式任务加载单元;

若否,在等待预设的时间间隔后,运行所述历史时间信息获取单元和所述分布式任务轮询单元。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

分布式任务加载判断单元,用于判断所述工作机对应的分布式任务是否加载成功;

若是,运行所述历史时间信息获取单元和所述分布式任务轮询单元;

若否,运行所述分布式任务加载单元。

与现有技术相比,本申请具有以下优点:

本申请提供的基于分布式锁加载分布式任务的方法,包括:工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息;根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务;设置未抢占到所述分布式锁的机器为备机。

所述基于分布式锁加载分布式任务的方法,分布式系统中成功抢占所述分布式锁的工作机,从其抢占到的所述分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息,并根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务,此外,所述分布式系统中未抢占到所述分布式锁的机器,被设置为备机。所述基于分布式锁加载分布式任务的方法,分布式系统中成功抢占到所述分布式锁的每一台工作机,均可从所述任务数据库中查找并加载对应的分布式任务,并且,每一台工作机加载各自对应的分布式任务的过程是相互独立的,因此,多台工作机可同时从任务数据库中查找并加载对应的分布式任务,从而缩短分布式任务的加载时间,提升分布式系统在加载分布式任务时的处理效率。

附图说明

附图1是本申请提供的一种基于分布式锁加载分布式任务的方法实施例的处理流程图;

附图2是本申请提供的一种基于分布式锁加载分布式任务的装置实施例的示意图。

具体实施方式

在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其他方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。

本申请提供一种基于分布式锁加载分布式任务的方法,本申请还提供一种基于分布式锁加载分布式任务的装置。

以下分别结合本申请提供的实施例的附图逐一进行详细说明,并且对方法的各个步骤进行说明。

本申请提供的一种基于分布式锁加载分布式任务的方法实施例如下:

参照附图1,其示出了本申请提供的一种基于分布式锁加载分布式任务的方法实施例的处理流程图。

步骤s101,工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息。

随着业务规模的不断增长,分布式系统中的计算规模也越来越大,对分布式系统提出了更高的要求,在分布式系统中分布式任务的初始化加载和增量加载时,为了避免由于加载不及时导致的告警,确保分布式服务的高可用性,需要在很短的时间内加载海量的分布式任务,给分布式系统的服务能力带来了严峻的考验。在这种情况下,采用本申请提供的基于分布式锁加载分布式任务的方法,在充分考虑分布式系统和分布式锁自身特点的基础上,从所述分布式系统中的机器入手,通过增加所述分布式系统中加载分布式任务的机器的数目,来缩短分布式系统中机器加载所述分布式任务的时间,从而确保分布式系统的高可用性。

在具体实施时,本步骤执行之前,还可以执行争抢分布式锁操作,成功争抢所述分布式锁的机器被设置为工作机,未抢占到所述分布式锁的机器被设置为备机。需要说明的是,n+m台所述机器中的每一台机器,执行所述争抢分布式锁操作的过程是相互独立的,即n+m台所述机器中的任意一台机器都可以发起争抢所述分布式锁操作。具体的,所述争抢分布式锁操作可采用如下方式实现:

1)分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁;

其中,每个分布式锁只能被n+m台所述机器中的一台机器抢占。

2)针对n+m台所述机器中的每一台机器,判断所述机器是否成功抢占所述分布式锁;

若是,表明所述机器成功抢占所述分布式锁,设置成功抢占所述分布式锁的机器为所述工作机,并执行本步骤,所述工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息;

若否,表明所述机器未抢占到所述分布式锁,返回执行所述分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁步骤,重新争抢所述分布式锁。

本申请实施例所述分布式系统,是基于zookeeper(典型的分布式应用程序协调服务)实现。所述分布式系统中可提供计算资源的n+m台机器,用于向外部应用提供计算资源,并用于加载外部应用的计算资源对应的分布式任务。例如,基于zookeeper实现的云服务器集群中,用于向外部应用提供计算资源的云服务器。此处的n和m均为正整数,n和m的取值,根据实际业务场景中分布式系统的负载情况,以及对加载时间和高可用性的需求来进行确定。

所述分布式锁,是控制不同分布式系统或者同一分布式系统的不同机器之间同步访问共享资源的一种方式。本实施例中,用所述zookeeper上的数据节点来表示预设的分布式锁,具体的,所述分布式锁,采用如下方式实现:

所述zookeeper上的n个数据节点;其中,所述n个数据节点中的每一个数据节点下,存储所述数据节点代表的分布式锁的任务配置信息。

本申请实施例所述任务配置信息,包括:所述分布式锁的数目n和所述分布式锁各自的锁标识;其中,所述分布式锁的锁标识小于所述分布式锁的数目n,且大于等于0。

例如,zookeeper中应用定义的目录下创建的n个数据节点,所述n个数据节点代表的n个分布式锁的锁标识依次为从0至n-1的整数,因此,第i(0<=i<n)个分布式锁的锁标识为i,则代表所述n个分布式锁的n个数据节点依次表示为:

lock(0)、lock(1)、···、lock(i)、···、lock(n-1),其中,i为大于等于0且小于n的整数。

lock(0)下存储的lock(0)代表的分布式锁的任务配置信息为(n,0),类似的,lock(1)下存储的任务配置信息为(n,1),lock(i)下存储的任务配置信息为(n,i),lock(n-1)下存储的任务配置信息为(n,n-1)。

具体实施时,所述数据节点下存储的任务配置信息,还可以是上述举例之外的其他信息,例如,lock(i)下存储的任务配置信息为mod_size=n&mod_result=i,i为大于等于0且小于n的整数,在此不做限定。

如上所述,所述分布式锁是用所述zookeeper上的数据节点来表示,因此,本步骤中,所述分布式系统中可提供计算资源的n+m台机器,基于分布式锁服务争抢预设的数目为n的分布式锁,是通过在所述数据节点下创建临时子节点,来抢占所述数据节点代表的所述分布式锁,一旦有机器成功创建临时子节点,则表示机器抢锁成功,创建临时子节点的数据节点代表机器抢占的分布式锁。具体采用如下方式实现:

n+m台所述机器在所述zookeeper服务器上的n个数据节点下,创建临时子节点,成功在所述数据节点下创建所述临时子节点的机器成功抢占所述数据节点代表的分布式锁。

如上所述,由于每个分布式锁只能被一台机器抢占,即:在抢锁时,每个数据节点代表的分布式锁只能被一台机器抢占,因此,所述zookeeper上创建的n个数据节点代表的n个分布式锁,最多只能被上述n+m台所述机器中的n台机器抢占,则最多只能有n台机器能够成功抢占所述分布式锁,被设置为所述工作机,相应的,最少有m台机器无法抢占到所述分布式锁,被设置为所述备机。

例如,n+m台所述机器中,数目为n的所述分布式锁全部被抢占,则n+m台所述机器中成功抢占到所述分布式锁的机器的数目为n,即所述工作机的数目为n;n+m台所述机器中剩余未抢占到所述分布式锁的机器的数目为m,即所述备机的数目为m。

在实际应用中,可以采用多种具体的实现方式实现所述分布式系统中的分布式锁,例如,采用自建的分布式锁功能替换上述基于zookeeper上创建的所述分布式锁,并且采用自建的分布式锁实现所述任务配置信息的存储。实现所述分布式锁的各种形式的变化,都只是具体实现方式的变更,都不偏离本申请的核心,因此都在本申请的保护范围之内。

优选的,为了避免由于软件故障(如网络断开等因素异常)和/或硬件故障导致工作机失去已抢占的所述分布式锁,本实施例中,上述针对n+m台所述机器中的每一台机器,判断所述机器是否成功抢占所述分布式锁步骤执行之后,且本步骤执行之前,执行所述分布式锁的轮询操作,来检测抢占到所述分布式锁的工作机是否失去已抢占的分布式锁。所述分布式锁的轮询操作,采用如下方式实现:

判断所述工作机是否失去已抢占的分布式锁;

若是,返回执行上述所述分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁步骤;

若否,则继续执行所述分布式锁的轮询操作,在等待预设的时间间隔后,返回执行所述判断所述工作机是否失去已抢占的分布式锁步骤。

具体实施时,本步骤执行之后,即所述工作机从其抢占到的分布式锁中读取所述任务配置信息之后,且下述步骤s102执行之前,即从任务数据库中查找并加载所述工作机对应的分布式任务之前,还可以执行所述工作机对应的分布式任务的轮询操作。

如果所述分布式任务的轮询操作的结果表明,所述任务数据库中有所述工作机对应的、未加载的分布式任务时,才执行下述步骤s102;否则不执行下述步骤s102,而是继续执行所述分布式任务的轮询操作,避免所述任务数据库中的分布式任务被全部加载之后,重复无意义的查询和加载操作。所述分布式任务的轮询操作具体采用如下方式实现:

获取所述工作机前一次加载对应的分布式任务的历史时间信息;

判断在所述历史时间信息至当前时间点的时间间隔内,所述任务数据库中是否有所述工作机对应的分布式任务产生;

若是,则执行下述步骤s102,根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务;

若否,则继续执行所述分布式任务的轮询操作,在等待预设的时间间隔后,返回执行所述获取所述工作机前一次加载对应的分布式任务的历史时间信息步骤,和所述判断在所述历史时间信息至当前时间点的时间间隔内,所述任务数据库中是否有所述工作机对应的分布式任务产生步骤。

步骤s102,根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务。

如上所述,所述分布式任务是存储在所述任务数据库中的,本申请实施例所述分布式任务记录在所述任务数据库的数据表中,所述数据表的主键包括:与所述分布式任务一一对应的任务标识;每个任务标识所在的记录用于记录一个分布式任务。所述主键为自增主键,且所述任务标识之间按照预设间隔阈值顺序排列。此处,由所述任务数据库来保证所述主键为自增主键,同样,由所述任务数据库来保证所述数据表中数据记录的唯一性,即保证所述分布式任务的唯一性。

例如,所述分布式任务在所述任务数据库中,按照下表所述的存储结构进行存储:

在实际应用中,可以采用多种具体的实现方式实现提供所述分布式任务,比如采用其他数据服务替换所述任务数据库提供所述分布式任务。实现提供所述分布式任务的各种形式的变化,都只是具体实现方式的变更,都不偏离本申请的核心,因此都在本申请的保护范围之内。

具体实施时,所述工作机在所述任务数据库中查找并加载对应的分布式任务,采用如下方式实现:

1)根据所述分布式锁的数目n和成功抢占所述分布式锁的工作机的机器标识,确定所述工作机的任务筛选条件;

本申请实施例所述任务筛选条件,是指所述任务标识对所述分布式锁的数目n取模,得到的值等于所述工作机的机器标识的分布式任务。其中,所述工作机的机器标识,由所述工作机抢占的分布式锁的锁标识确定,本实施例中,所述工作机的机器标识与所述工作机抢占的分布式锁的锁标识一致。例如,上述n个分布式锁的锁标识依次为从0至n-1的整数,第i(0<=i<n)个分布式锁的锁标识为i;相应的,n个工作机的机器标识与各自抢占的分布式锁的锁标识一致,依次为从0至n-1的整数,第i(0<=i<n)个工作机的机器标识同样为i。

在实际应用中,可以采用多种形式实现所述任务筛选条件。实现所述任务筛选条件的各种形式的变化,都只是具体实现方式的变更,都不偏离本申请的核心,因此都在本申请的保护范围之内。

2)在所述数据表中查找满足所述工作机的任务筛选条件的分布式任务,作为所述工作机对应的分布式任务;

如上所述,所述任务筛选条件是指所述任务标识对所述分布式锁的数目n取模,得到的值等于所述工作机的机器标识的分布式任务。相应的,在所述数据表中查找满足所述工作机的任务筛选条件的分布式任务,是指在所述任务数据库的数据表中,查找所述任务标识对所述分布式锁的数目n取模,得到的值等于所述工作机的机器标识的分布式任务。例如,第i(0<=i<n)个工作机的机器标识为i,则在数据表中查找任务标识(id)对n取模得到的值为i的分布式任务,即:id%n=i。

如上所述,所述分布式锁的数目n为定值,所述数据表中的自增主键(id)是唯一的,因此,所述自增主键(id)对n取模得到的值也是唯一的,从而能够保证所述数据表中记录的一个分布式任务只能分配到一台工作机上。

此外,所述自增主键(id)对n取模得到的值,只有0到n-1共n种结果,并且分别落在相应的各台工作机上,可保证所述数据表中的分布式任务在加载时没有遗漏;同时,又由于数据库的增、删、改、查操作产生的所述数据表中记录的分布式任务的随机性,以及所述自增主键(id)的自增性,因此可以保证所述自增主键(id)对n取模后分配到各台工作机上的分布式任务比较平均,提升了所述分布式系统的性能和稳定性。

3)将查找到的所述分布式任务分别加载到各自对应的所述工作机上。

具体实施时,根据所述工作机的任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务之后,为了确认所述工作机加载的对应的分布式任务是否加载成功,执行所述工作机加载的对应的分布式任务的加载确认操作,如果加载失败,则需重新加载。所述加载确认操作,采用如下方式实现:

判断所述工作机对应的分布式任务是否加载成功;

若是,返回执行所述获取所述工作机前一次加载对应的分布式任务的历史时间信息步骤,和所述判断在所述历史时间信息至当前时间点的时间间隔内,所述任务数据库中是否有所述工作机对应的分布式任务产生步骤;

若否,则需重新加载,执行本步骤,根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务。

步骤s103,设置未抢占到所述分布式锁的机器为备机。

如上所述,由于每个分布式锁只能被一台机器抢占,因此,本实施例n+m台所述机器中,最多只能有n台机器成功抢占所述分布式锁,被设置为所述工作机,最少有m台机器无法抢占到所述分布式锁,n+m台所述机器中未抢占到所述分布式锁的机器被设置为备机。

例如,n+m台所述机器中,数目为n的所述分布式锁全部被抢占,则n+m台所述机器中剩余未抢占到所述分布式锁的机器的数目为m,即所述备机的数目为m。

所述备机的作用是在工作机出现故障的情况下,替代出现故障的工作机运行,例如,n台工作机中的其中一台工作机发生宕机,则由所述m台备机中的任意一台机器代替发生故障的工作机运行;相应的,如果有多台工作机发生宕机,所述m台备机中的任意多台机器可分别代替发生故障的工作机运行;避免了由于一台或者多台工作机发生宕机,重新加载和调度所有工作机的分布式任务造成的负载升高,使分布式系统的处理更加及时。

具体实施时,所述备机通过在所述zookeeper上的n个数据节点下注册监听节点,来监听所述分布式锁。例如,针对所述m台备机中的任意一台机器,分别在lock(0)、lock(1)、···、lock(i)、···、lock(n-1)下创建一个watcher监听,分别来监听所述n个数据节点的变更情况,从而来监听所述n个数据节点代表的n个分布式锁的状态。

此外,在具体实施时,如果成功抢占所述分布式锁的工作机发生宕机,则代表发生宕机的工作机抢占的分布式锁的数据节点下创建的临时子节点被删除,具体采用如下方式实现:

获取一台或者多台工作机发生宕机的机器状态信息;

基于zookeeper删除所述机器状态信息各自对应的工作机的数据节点下创建的临时子节点。

如上所述,所述备机通过在所述zookeeper上的n个数据节点下注册监听节点,来监听所述分布式锁,因此,当有工作机发生宕机时,zookeeper服务能够保证自动删除发生宕机的工作机在相应数据节点下创建的临时子节点。

所述备机通过监听节点,监听到发生宕机的工作机抢占的分布式锁的状态发生变更之后,可以抢占发生宕机的工作机抢占的分布式锁,实现了由抢占到分布式锁的备机替代发生宕机的工作机运行。避免了在master-slave(管理者-追随者)模式下,由于master(管理者)宕机后由新的抢占到分布式锁的slave(追随者)替代,导致的分布式任务重新分配的问题,从而避免了由于分布式任务重新分配导致的分布式任务加载不及时的缺陷,使分布式系统的处理更加及时,进一步确保分布式系统的高可用性。优选的,当有工作机发生宕机时,所述备机抢占发生宕机的工作机的分布式锁,采用如下方式实现:

若所述备机监听到所述数据节点下创建的临时子节点被删除,则所述备机通过在临时子节点被删除的数据节点下创建临时子节点,抢占所述临时子节点被删除的数据节点代表的分布式锁。

综上所述,本申请提供的所述基于分布式锁加载分布式任务的方法,分布式系统中成功抢占所述分布式锁的工作机,从其抢占到的所述分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息,并根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务,此外,所述分布式系统中未抢占到所述分布式锁的机器,被设置为备机。所述基于分布式锁加载分布式任务的方法,分布式系统中成功抢占到所述分布式锁的每一台工作机,均可从所述任务数据库中查找并加载对应的分布式任务,并且,每一台工作机加载各自对应的分布式任务的过程是相互独立的,因此,多台工作机可同时从任务数据库中查找并加载对应的分布式任务,从而缩短分布式任务的加载时间,提升分布式系统在加载分布式任务时的处理效率。

本申请提供的一种基于分布式锁加载分布式任务的装置实施例如下:

在上述的实施例中,提供了一种基于分布式锁加载分布式任务的方法,与之相对应的,本申请还提供了一种基于分布式锁加载分布式任务的装置,下面结合附图进行说明。

参照附图2,其示出了本申请提供的一种基于分布式锁加载分布式任务的装置实施例的示意图。

由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关的部分请参见上述提供的方法实施例的对应说明即可。下述描述的装置实施例仅仅是示意性的。

本申请提供一种基于分布式锁加载分布式任务的装置,包括:

任务配置信息读取单元201,工作机从其抢占到的分布式锁中读取预先存储的任务配置信息,作为所述工作机的任务配置信息;

分布式任务加载单元202,用于根据所述任务配置信息,从任务数据库中查找并加载所述工作机对应的分布式任务;

备机设置单元203,用于设置未抢占到所述分布式锁的机器为备机。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

分布式锁争抢单元,用于分布式系统中可提供计算资源的n+m台所述机器,基于分布式锁服务争抢预设的数目为n的所述分布式锁;每个分布式锁只能被一台机器抢占;

针对n+m台所述机器中的每一台机器,运行分布式锁抢占判断单元,所述分布式锁抢占判断单元,用于判断所述机器是否成功抢占所述分布式锁;

若是,运行工作机设置单元和所述任务配置信息读取单元201;

所述工作机设置单元,用于设置成功抢占所述分布式锁的机器为所述工作机;

若否,运行所述分布式锁争抢单元。

可选的,所述任务配置信息,包括:

所述分布式锁的数目n和所述分布式锁各自的锁标识;

其中,所述分布式锁的锁标识小于所述分布式锁的数目n,且大于等于0。

可选的,所述分布式任务记录在所述任务数据库的数据表中,所述数据表的主键包括:与所述分布式任务一一对应的任务标识;

每个任务标识所在的记录用于记录一个分布式任务。

可选的,所述分布式任务加载单元202,包括:

任务筛选条件确定子单元,用于根据所述分布式锁的数目n和成功抢占所述分布式锁的工作机的机器标识,确定所述工作机的任务筛选条件;

分布式任务查找子单元,用于在所述数据表中查找满足所述工作机的任务筛选条件的分布式任务,作为所述工作机对应的分布式任务;

分布式任务加载子单元,用于将查找到的所述分布式任务分别加载到各自对应的所述工作机上。

可选的,所述任务筛选条件,包括:

所述任务标识对所述分布式锁的数目n取模,得到的值等于所述工作机的机器标识的分布式任务;

其中,所述工作机的机器标识,由所述工作机抢占的分布式锁的锁标识确定。

可选的,所述主键为自增主键,且所述任务标识之间按照预设间隔阈值顺序排列。

可选的,所述分布式系统是基于zookeeper实现;

相应的,所述分布式锁,采用如下方式实现:

所述zookeeper上的n个数据节点;

其中,所述n个数据节点中的每一个数据节点下,存储所述数据节点代表的分布式锁的任务配置信息。

可选的,所述分布式锁争抢单元,具体用于n+m台所述机器在所述zookeeper上的n个数据节点下,创建临时子节点,成功在所述数据节点下创建所述临时子节点的机器成功抢占所述数据节点代表的分布式锁。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

监听节点注册单元,用于所述备机通过在所述zookeeper上的n个数据节点下注册监听节点,来监听所述分布式锁。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

机器状态信息获取单元,用于获取一台或者多台工作机发生宕机的机器状态信息;

临时子节点删除单元,用于基于zookeeper删除所述机器状态信息各自对应的工作机的数据节点下创建的临时子节点。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

第二分布式锁争抢单元,用于在所述备机监听到所述数据节点下创建的临时子节点被删除时,所述备机通过在临时子节点被删除的数据节点下创建临时子节点,抢占所述临时子节点被删除的数据节点代表的分布式锁。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

分布式锁轮询单元,用于判断所述工作机是否失去已抢占的分布式锁;

若是,运行所述分布式锁争抢单元;

若否,在等待预设的时间间隔后,运行所述分布式锁轮询单元。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

历史时间信息获取单元,用于获取所述工作机前一次加载对应的分布式任务的历史时间信息;

分布式任务轮询单元,用于判断在所述历史时间信息至当前时间点的时间间隔内,所述任务数据库中是否有所述工作机对应的分布式任务产生;

若是,运行所述分布式任务加载单元202;

若否,在等待预设的时间间隔后,运行所述历史时间信息获取单元和所述分布式任务轮询单元。

可选的,所述基于分布式锁加载分布式任务的装置,包括:

分布式任务加载判断单元,用于判断所述工作机对应的分布式任务是否加载成功;

若是,运行所述历史时间信息获取单元和所述分布式任务轮询单元;

若否,运行所述分布式任务加载单元202。

本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

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