基于Redis的作业请求调度方法、装置、设备及介质
文献发布时间:2023-06-19 12:18:04
技术领域
本发明涉及计算机技术领域,尤其涉及一种基于Redis的作业请求调度方法、装置、设备及介质。
背景技术
随着计算机技术的飞速发展,计算机和互联网技术在各个行业中广泛应用,集群系统也逐渐在各个领域进行应用。
现有技术中,在银行等金融领域,涉及到对数据进行分析处理的集群系统中至少包括多个应用服务器以及多个代理服务器,一般来说应用服务器的数量多于代理服务器,应用服务器可向代理服务器发送作业请求以使代理服务器执行相应的作业,然而,在代理服务器资源有限的情况下,代理服务器同一时间只能处理来自于一个应用服务器的请求,其他的应用服务器在确定要发送作业请求的代理服务器时,需要遍历每个应用服务器,以确定各个代理服务器中是否存在空闲的服务器。
然而,应用服务器去遍历其他的多个应用服务器,其处理效率较低,导致处理作业请求的效率也比较低。
发明内容
本发明实施例提供一种基于Redis的作业请求调度方法、装置、设备及介质,用于解决现有技术中应用服务器去遍历其他的多个应用服务器,其处理效率较低,导致处理作业请求的效率也比较低的问题。
第一方面,本发明实施例提供一种基于Redis的作业请求调度方法,包括:
根据先入先出规则从Redis集群中的作业请求队列中获取待处理的作业请求;
根据预设的调度规则,从所述Redis集群中存储的代理资源列表中获取目标代理资源,所述目标代理资源对应的字符集与所述作业请求一致和/或所述目标代理资源对应的代理服务器执行的进程最少;
将所述作业请求发送至所述目标代理资源对应的代理服务器进行处理,并对所述Redis集群中所述目标代理资源进行锁定。
在一种具体实施方式中,所述方法还包括:
在确定所述代理服务器将所述作业请求的结果返回对应的应用服务器之后,释放对所述Redis集群中所述目标代理资源的锁定,并从所述作业请求队列的首位移除所述作业请求。
在一种具体实施方式中,所述方法还包括:
在接收到任一应用服务器发送的请求代理资源的作业请求时,根据应用服务器的字符集,将所述作业请求添加至所述Redis集群中与所述字符集对应的作业请求队列的队尾。
在一种具体实施方式中,所述调度规则包括:字符集一致规则和/或执行进程数最少原则,所述代理资源列表中包括多个代理资源,每个代理资源包括:代理字符集,代理服务器的IP地址以及端口。
在一种具体实施方式中,所述根据预设的调度规则,从所述Redis集群中存储的代理资源列表中获取目标代理资源,包括:
遍历所述代理资源列表中的每个代理资源,若当前代理资源正在执行的进程数为0或者小于单个代理进程数阈值,则确定当前代理资源为所述目标代理资源;
或者,
遍历所述代理资源列表中的每个代理资源,若当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定当前代理资源为所述目标代理资源。
可选的,所述根据预设的调度规则,从所述Redis集群中存储的代理资源列表中获取目标代理资源,包括:
遍历所述代理资源列表中的每个代理资源,若当前代理资源正在执行的进程数大于0,则确定当前代理资源中的代理字符集与所述作业请求对应的字符集是否一致;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定所述当前代理资源正在执行的进程数是否小于单个代理进程数阈值;
若所述当前代理资源正在执行的进程数小于单个代理进程数阈值,则将所述当前代理资源确定为所述目标代理资源;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集不一致,或者,所述当前代理资源正在执行的进程数大于或等于单个代理进程数阈值,则对下一个代理资源进行确定。
可选的,所述根据预设的调度规则,从所述Redis集群中存储的代理资源列表中获取目标代理资源,包括:
遍历所述代理资源列表中的每个代理资源,确定当前代理资源中的代理字符集与所述作业请求对应的字符集是否一致;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定所述当前代理资源正在执行的进程数是否小于单个代理进程数阈值;
若所述当前代理资源正在执行的进程数小于单个代理进程数阈值,则将所述当前代理资源确定为所述目标代理资源;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集不一致,或者,所述当前代理资源正在执行的进程数大于或等于单个代理进程数阈值,则对下一个代理资源进行确定。
可选的,所述Redis集群中设置有多个作业请求队列,每个作业请求队列用于缓存不同的字符集对应的作业请求。
第二方面,本发明实施例提供一种基于Redis的作业请求调度装置,包括:
处理模块,用于根据先入先出规则从Redis集群中的作业请求队列中获取待处理的作业请求;
所述处理模块还用于根据预设的调度规则,从所述Redis集群中存储的代理资源列表中获取目标代理资源,所述目标代理资源对应的字符集与所述作业请求一致和/或所述目标代理资源对应的代理服务器执行的进程最少;
发送模块,用于将所述作业请求发送至所述目标代理资源对应的代理服务器进行处理,并对所述Redis集群中所述目标代理资源进行锁定。
在一种具体实施方式中,所述处理模块还用于:
在确定所述代理服务器将所述作业请求的结果返回对应的应用服务器之后,释放对所述Redis集群中所述目标代理资源的锁定,并从所述作业请求队列的首位移除所述作业请求。
在一种具体实施方式中,所述处理模块还用于:
在接收到任一应用服务器发送的请求代理资源的作业请求时,根据应用服务器的字符集,将所述作业请求添加至所述Redis集群中与所述字符集对应的作业请求队列的队尾。
在一种具体实施方式中,所述调度规则包括:字符集一致规则和/或执行进程数最少原则,所述代理资源列表中包括多个代理资源,每个代理资源包括:代理字符集,代理服务器的IP地址以及端口。
在一种具体实施方式中,所述处理模块具体用于:
遍历所述代理资源列表中的每个代理资源,若当前代理资源正在执行的进程数为0或者小于单个代理进程数阈值,则确定当前代理资源为所述目标代理资源;
或者,
遍历所述代理资源列表中的每个代理资源,若当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定当前代理资源为所述目标代理资源。
可选的,所述处理模块具体用于:
遍历所述代理资源列表中的每个代理资源,若当前代理资源正在执行的进程数大于0,则确定当前代理资源中的代理字符集与所述作业请求对应的字符集是否一致;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定所述当前代理资源正在执行的进程数是否小于单个代理进程数阈值;
若所述当前代理资源正在执行的进程数小于单个代理进程数阈值,则将所述当前代理资源确定为所述目标代理资源;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集不一致,或者,所述当前代理资源正在执行的进程数大于或等于单个代理进程数阈值,则对下一个代理资源进行确定。
可选的,所述处理模块具体用于:
遍历所述代理资源列表中的每个代理资源,确定当前代理资源中的代理字符集与所述作业请求对应的字符集是否一致;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定所述当前代理资源正在执行的进程数是否小于单个代理进程数阈值;
若所述当前代理资源正在执行的进程数小于单个代理进程数阈值,则将所述当前代理资源确定为所述目标代理资源;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集不一致,或者,所述当前代理资源正在执行的进程数大于或等于单个代理进程数阈值,则对下一个代理资源进行确定。
可选的,所述Redis集群中设置有多个作业请求队列,每个作业请求队列用于缓存不同的字符集对应的作业请求。
第三方面,本发明实施例提供一种电子设备,包括:
处理器,存储器,通信接口;
所述存储器用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行第一方面任一项所述的基于Redis的作业请求调度方法。
第四方面,本发明实施例提供一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现第一方面任一项所述的基于Redis的作业请求调度方法。
第五方面,本发明实施例提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时用于实现第一方面任一项所述的基于Redis的作业请求调度方法。
本发明实施例提供的基于Redis的作业请求调度方法、装置、设备及介质,该方法中,实现管理功能的电子设备根据先入先出规则从Redis集群中的作业请求队列中获取待处理的作业请求。然后根据预设的调度规则,从所述Redis集群中存储的代理资源列表中获取目标代理资源,目标代理资源对应的字符集与作业请求一致和/或目标代理资源对应的代理服务器执行的进程最少。最后将将作业请求发送至目标代理资源对应的代理服务器进行处理,并在Redis集群中将目标代理资源进行锁定。将代理资源以及作业请求队列等信息存储在Redis中以便实现快速访问,并且在对代理资源进行调度的过程中考虑了字符集一致以及空闲程度,实现了作业请求调度的软负载,有效提升代理资源调度的效率和作业请求执行的效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的基于Redis的作业请求调度方法的应用场景示意图;
图2为本发明提供的基于Redis的作业请求调度方法实施例一的流程示意图;
图3为本发明提供的基于Redis的作业请求调度方法实施例二的流程示意图;
图4为本发明提供的一种作业请求队列的示意图;
图5为本发明提供的一种代理资源调度示意图;
图6为本发明提供的基于Redis的作业请求调度装置实施例一的结构示意图;
图7为本发明提供的一种电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在根据本实施例的启示下作出的所有其他实施例,都属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
现有技术中,应用服务器在需要调度代理服务器进行作业请求的处理时候,需要遍历其他的多个应用服务器,导致处理时间长,作业请求的处理效率较低。
针对上述技术问题,本发明提供的一种在集群环境下基于Redis的代理调度方法,该方法的核心思想为:通过Redis缓存管理作业请求队列和代理资源信息,根据代理的字符集一致和/或空闲程度相对空闲的调度原则。同时还结合Redis的分布式锁技术,实现了代理调度的软负载,并考虑了可能出现的调度超时等异常情况并给出了相应的解决方案,有效提升了代理资源调度和代理执行作业请求的效率。
图1为本发明提供的基于Redis的作业请求调度方法的应用场景示意图,如图1所示,该场景中至少包括多个应用服务器,多个代理服务器以及Redis集群,以及作为管理端实现调度管理的电子设备,该电子设备可以通过软件监听各个应用服务器发送的需要进行代理服务资源进行调度的作业请求,也可以快速对Redis集群进行访问,管理Redis集群中的多个作业请求队列以及代理资源等。代理服务器,也称为代理客户端,或者数据代理,用于对接收到的作业请求进行后续的处理,并在获取到处理结果之后向对应的应用服务器返回处理结果。
基于该应用场景,下面通过几个具体的实施例对本发明提供的基于Redis的作业请求调度方法进行详细说明。
本发明中涉及到的术语解释如下:
数据代理:也称为代理服务器,代理客户端等,是一个部署在linux操作系统上的数据库客户端软件,用于与数据库服务器端进行连接并发送相应的处理指令提交给服务器端并获取返回结果。
Redis:是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的应用程序接口(Application ProgrammingInterface,API)。
图2为本发明提供的基于Redis的作业请求调度方法实施例一的流程示意图,如图2所示,该方案主要应用在用于实现管理调度功能的电子设备中,需要与应用服务器以及代理服务器之间进行信息交互,具体的,该基于Redis的作业请求调度方法具体包括以下步骤:
S101:根据先入先出规则从Redis集群中的作业请求队列中获取待处理的作业请求。
在本步骤中,Redis集群中包括多个作业请求队列,每个作业请求队列均用来对需要调度代理资源的作业请求进行缓存,以避免出现同时对多个作业请求进行调度导致的拥塞等问题。本方案中将作业请求加入队列,通过轻量级的消息队列,实现作业请求的有序处理。
可选的,所述Redis集群中设置的多个作业请求队列,每个作业请求队列用于缓存不同的字符集对应的作业请求。也就是说每个作业请求队列中存储的作业请求对应的应用服务器的字符集不同。
在具体对作业请求进行调度时候,可以遵循先入先出规则,从存储了待处理作业请求的队列的队头,获取出一个待处理的作业请求。如果能够同时并行的对多个作业请求进行处理,则也可以同时从一个队列的队头依次获取出多个待处理的作业请求或者从不同的队列的队头中获取出多个待处理的作业请求,对此本方案不做限制。
S102:根据预设的调度规则,从Redis集群中存储的代理资源列表中获取目标代理资源,目标代理资源对应的字符集与作业请求一致和/或目标代理资源对应的代理服务器执行的进程最少。
在本步骤中,电子设备在作业请求队列中获取出了作业请求之后,则需要对该作业请求进行资源调。在Redis集群中还存储了所有的可调度的代理资源列表,该代理资源列表中包括多个可调度的代理资源,也就是资源信息。
在一种具体实现中,每个代理资源至少:包括代理字符集,代理服务器的IP地址以及端口。
电子设备在对作业请求进行资源调度时候需要按照一定的调度规则进行,该调度规则包括字符集一致规则和/或执行进程数最少原则。也就是说选择出的代理资源至少要满足字符集一致规则和执行进程数最少原则的至少一个原则,才能确认为最终对作业请求进行处理的代理资源。
在该方案的一种具体实现中,电子设备基于调度规则以及代理资源列表进行资源调度至少包括以下几种实现方式:
第一种实现方式,遍历所述代理资源列表中的每个代理资源,若当前代理资源正在执行的进程数为0或者小于单个代理进程数阈值,则确定当前代理资源为所述目标代理资源。
本方案中,可以按照代理资源列表中存储的代理资源的顺序,或者随机的顺序,对代理资源进行确定,首先,查询代理资源对应的进程,确定当前代理资源正在处理的进程数是不是为0,如果为0则证明该代理资源对应的代理服务器是空闲的,可以分配给该作业请求,作为目标代理资源。则不再进行后续其他代理资源的确定。如果当前代理资源正在处理的进程数大于0,但是小于单个代理进程数阈值,也就是说当前代理资源对应的应用服务器能够处理的进程还未饱和,则也可以将该代理资源分配给该作业请求作为目标代理资源,不再进行后续其他代理资源的确定。
通过该实现方式确定出的目标代理资源只满足调度规则中的代理服务器执行的进程最少或者相对少的原则。
第二种实现方式,遍历所述代理资源列表中的每个代理资源,若当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定当前代理资源为所述目标代理资源。
在本方案中,可以按照代理资源列表中存储的代理资源的顺序,或者随机的顺序,对代理资源进行确定,首先,查询当前代理资源中的字符集,然后获取发送该作业请求的应用服务器的字符集,确定当前代理资源的字符集与作业请求对应的字符集是否一致,如果一致则将该当前代理资源分配给该作业请求,如果不一致,则继续对下一个代理资源进行判断,直至确定出字符集一致的代理资源作为目标代理资源。
通过该实现方式确定出的目标代理资源只满足调度规则中的字符集一致规则。
第三种实现方式,遍历所述代理资源列表中的每个代理资源,若当前代理资源正在执行的进程数大于0,则确定当前代理资源中的代理字符集与所述作业请求对应的字符集是否一致;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定所述当前代理资源正在执行的进程数是否小于单个代理进程数阈值;
若所述当前代理资源正在执行的进程数小于单个代理进程数阈值,则将所述当前代理资源确定为所述目标代理资源;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集不一致,或者,所述当前代理资源正在执行的进程数大于或等于单个代理进程数阈值,则对下一个代理资源进行确定。
在该方案中,与前述的两种方式有所不同,确定出的目标代理资源需要同时满足进程数最少原则和字符集一致规则。
本方案中同样可以按照代理资源列表中存储的代理资源的顺序,或者随机的顺序,依次对每个代理资源进行确定。如确定当前代理资源正在执行的进程数为0直接确定为目标代理资源。如果当前代理资源正在执行的进程数大于0,则需要确定当前代理资源中的代理字符集与作业请求对应的字符集是否一致;如果不一致直接进行下一个代理资源的确认,如果一致,则需要判断当前代理资源正在执行的进程数是否小于单个代理进程数阈值,也就是说需要确定执行进程是否饱和。若正在执行的进程数小于单个代理进程数阈值,则将当前代理资源确定为目标代理资源,若正在执行的进程数大于或等于单个代理进程数阈值,则进行下一个代理资源的确定。
第四种实现方式,遍历所述代理资源列表中的每个代理资源,确定当前代理资源中的代理字符集与所述作业请求对应的字符集是否一致;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定所述当前代理资源正在执行的进程数是否小于单个代理进程数阈值;
若所述当前代理资源正在执行的进程数小于单个代理进程数阈值,则将所述当前代理资源确定为所述目标代理资源;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集不一致,或者,所述当前代理资源正在执行的进程数大于或等于单个代理进程数阈值,则对下一个代理资源进行确定。
在该方案中,与前述的两种方式有所不同,确定出的目标代理资源需要同时满足进程数最少原则和字符集一致规则。与第三种方式的主要不同之处在于先进行字符集一致的判断,后进行进程数判断。
本方案中同样可以按照代理资源列表中存储的代理资源的顺序,或者随机的顺序,依次对每个代理资源进行确定。首先,确定当前代理资源中的代理字符集与作业请求对应的字符集是否一致;如果不一致直接进行下一个代理资源的确认,如果一致,则需要判断当前代理资源正在执行的进程数是否小于单个代理进程数阈值,也就是说需要确定执行进程是否饱和。若正在执行的进程数小于单个代理进程数阈值,则将当前代理资源确定为目标代理资源,若正在执行的进程数大于或等于单个代理进程数阈值,则进行下一个代理资源的确定。
S103:将作业请求发送至目标代理资源对应的代理服务器进行处理,并对Redis集群中目标代理资源进行锁定。
在本步骤中,在通过上述方式确定出了处理该作业请求的目标代理资源之后,则可以基于目标代理资源中的代理服务器的IP地址以及端口,将该作业请求发送至对应的代理服务器进行处理。
进一步的,为了避免该代理资源被其他集群中的其他服务器更新,则可以申请获取分布式锁,对该目标代理资源进行锁定,主要是对该目标代理资源的执行信息进行锁定。直至该作业请求执行完成之后可将该目标代理资源的分布式锁删除。
本实施例提供的基于Redis的作业请求调度方法,实现管理功能的电子设备根据先入先出规则从Redis集群中的作业请求队列中获取待处理的作业请求。然后根据预设的调度规则,从Redis集群中存储的代理资源列表中获取目标代理资源,目标代理资源满足字符集与作业请求一致和/或代理服务器执行的进程最少。最后将作业请求发送至目标代理资源对应的代理服务器进行处理,并在Redis集群中将目标代理资源进行锁定。将代理资源以及作业请求队列等信息存储在Redis中以便实现快速访问,在调度代理资源时考虑了字符集一致以及空闲程度,实现了作业请求调度的软负载,有效提升代理资源调度的效率和作业请求执行的效率。
图3为本发明提供的基于Redis的作业请求调度方法实施例二的流程示意图,如图3所示,在上述实施例一的基础上,在完成了一个作业请求的执行,并向应用服务器返回了结果之后,该基于Redis的作业请求调度方法还包括以下步骤:
S201:在确定代理服务器将作业请求的结果返回对应的应用服务器之后,释放对Redis集群中目标代理资源的锁定,并从作业请求队列的首位移除述作业请求。
在上述实施例的基础上,在目标代理资源对应的代理服务器将作业请求处理完成,将处理结果返回了对应的应用服务器之后,则该目标代理资源可以继续分配给其他的作业请求,此时则可以将Redis集群中目标代理资源的进行释放,即可以删除掉该该目标代理资源的分布式锁。
同时,由于该作业请求已经处理完成,对于作业请求队列中的该作业请求也要进行移除,以便对该队列中的下一个作业请求进行调度处理。
可选的,在前述任一实现方式的基础上,Redis集群中存储有多种字符集对应的多个作业请求队列,在任一应用服务器发送了作业请求之后,均可以将该作业请求加入相应的作业请求队列以根据队列顺序进行资源调度。具体的该基于Redis的作业请求调度方法还包括以下步骤:
S301:在接收到任一应用服务器发送的请求代理资源的作业请求时,根据应用服务器的字符集,将作业请求添加至Redis集群中与字符集对应的作业请求队列的队尾。
在上述任一实施例的基础上,对于任何时刻,当接收到了任一应用服务器发送的作业请求之后,与现有技术不同,本方案中不对其他应用服务器进行遍历,而是根据该应用服务器的字符集,将该作业请求添加至Redis集群中与字符集对应的作业请求队列的队尾。等待电子设备根据先入先出的原则以及代理资源列表中具体的资源信息依次进行调度处理。
本发明提供的基于Redis的作业请求调度方法,实现了集群模式下基于Redis的代理调度算法,即首先进行请求代理资源的作业请求队列管理,根据一定的调度规则,循环遍历代理资源列表中符合条件的数据代理(代理资源,或者代理服务器),获取到相应的代理资源后再请求Redis分布式锁进行命中代理和请求队列的信息更新,然后继续处理队列中的下个作业请求,实现了集群模式下高并发时对于共享资源的互斥操作,确保了代理关键执行信息更新时的数据一致性问题,同时队列信息和代理的执行信息等关键信息缓存在Redis中,也提高了访问效率。
基于前述各个实施例的方案,下面通过举例对本发明提供的基于Redis的作业请求调度方法进行更进一步的描述。
本发明提供的方案中存在多个数据代理,也就是多个代理服务器,由管理端(也就是前述的电子设备)根据一定的调度规则调用数据代理完成作业步执行的功能。F5某种程度上可以解决该问题但代价昂贵,且无法完全根据制定的规则进行代理的调配。因此需要建立一套能根据项目要求规则(算法)进行代理调度的软负载调度机制十分必要,需要开发人员设计一种符合调度的模型(队列)和相应的共享代理资源的信息更新互斥机制并保证该调度模型在集群环境下能正常运作实现代理的最优调度,并且考虑对调度中可能出现的异常情况如调度超时的处理。
在本方案的具体实现中,涉及到以下几个功能的实现:
第一,作业请求的队列管理;
第二,资源调度的调度规则;
第三,具体的资源调度的实现。
下面对这几个功能分别进行介绍:
第一,作业请求的队列管理
在集群部署模式下,多台应用服务器执行作业请求(也称为作业步)时都要申请代理资源,根据先请求先处理的原则,将代理资源的请求方抽象为队列模型进行管理,使用Redis实现轻量级的消息队列。图4为本发明提供的一种作业请求队列的示意图。如图4所示,Redis提供了push和pop命令,遵循先入先出(First Input First Output,简称,FIFO)的原则,Redis中的作业请求队列list是有序的且可以重复的,作为作业请求队列使用时使用rpush操作入队,使用lpop操作出队,即右进左出。
本方案中,将请求代理资源的作业请求队列按字符集分类存储在Redis中,每次有新的作业请求需要申请代理资源时便添加至对应字符集的作业请求队列的队尾,程序监听该作业请求队列,并每次轮询处于队首的作业请求,根据一定的调度算法如果为该作业步分配了相应的代理资源,则从队列中队首位置移除该作业请求,否则休眠一段时间后继续处理该作业请求的代理资源调度,直至队列中的所有作业请求均已处理完毕即分配了相应的代理资源。
第二,资源调度的调度规则;
本方案中,代理调度时遵循下述的调度规则:
1),字符集一致的规则
代理资源(即数据代理)根据其支持的字符集而被划分为不同字符集类型的代理资源,如支持UTF-8字符集的代理资源A和支持GBK字符集的代理资源B,如果当前请求作业请求的数据库字符集是UTF-8,根据字符集一致的原则会选择代理资源A,确保不会出现乱码问题。
2),执行进程数少原则
代理资源当前的执行进程数(即空闲程度)是重要的考量因素,即相同字符集类型的代理资源A和代理资源B,如果A当前有1个数据作业在执行,B当前没有正在执行的作业是空闲的,那么调度算法会优先选择空闲的代理资源B;如果A和B当前都有数据作业在执行,如A当前有1个数据作业在执行,B当前有3个数据作业在执行,那么调度算法会选择当前执行的作业数较少即相对空闲的代理资源A。
第三,具体的资源调度的实现。
明确了用队列管理调度请求方以及相应的调度规则后,便是采用调度规则调度资源的具体实现了。首先要确保对于作业请求的调度在高并发情况下依然能健壮的处理而不致瘫痪或失灵,其次为请求方分配到某个具体的代理资源后,要实现对代理资源的加锁操作,以免被下个作业请求继续请求该代理资源。基于上述原因,以及Redis天生的原子性操作和分布式锁技术以及对高并发的较好支持,本案中选择使用Redis作为存放代理资源的相关信息和分布式锁的介质。
资源调度具体的实现方式如下:首先可进行模型初始化,将代理资源的相关信息存储在Redis中,即以“dbAgent”+代理的IP地址+端口作为Redis中存放代理资源的key值,相应的value值则为该代理的属性信息,主要包括代理当前的执行进程数和代理字符集。算法循环遍历代理资源列表中的代理资源,首先判断当前代理资源的当前执行进程数是否为0,如果为0说明该代理总院当前没有正在执行的任务则选择该代理资源作为目标代理资源;如果不为0则判断当前代理资源的字符集是否和请求方(也就是发送该作业请求的应用服务器)的数据库字符集一致,如果不一致则继续循环读取代理资源列表中的下个代理资源,如果一致则再判断该代理资源的当前执行进程数是否小于单个代理进程数并发上限,也就是判断是否饱和,如果不满足则继续循环下个代理资源,如果满足则选择将该代理资源的当前执行进程数作为执行进程数的比较基准并记录下该代理资源的序号,再继续循环下个代理资源将当前执行进程数再与执行进程数的比较基准进行比较选择两者的较小值作为新的执行进程数比较基准再继续循环,直至找出代理资源列表中当前执行进程数最少的代理资源。接着获取该代理资源的分布式锁,以“dbAgent”+代理的IP地址+端口+“Lock”作为该分布式锁的关键字缓存在Redis中。图5为本发明提供的一种代理资源调度示意图,如图5所示,申请获取该代理资源的分布式锁成功后再更新该代理资源的执行信息避免同一时刻被其集群中的其它服务器更新,做到了用户在集群环境下的并发控制。代理资源的执行信息更新完成后,再删除该分布式锁。
在集群场景下,对多请求的代理资源的执行信息的更新机制做了分布式锁控制。分布式锁应用于分布式系统环境相比单机锁更为复杂,该锁需要具备一下特性:即互斥性、健壮性、唯一性和高可用。互斥性即在任意时刻,只有一个客户端能持有锁。其他尝试获取锁的客户端都将失败而返回或阻塞等待;健壮性是指一个客户端持有锁的期间崩溃而没有主动释放锁,也需要保证后续其他客户端能够加锁成功;唯一性即加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给释放了,自己持有的锁也不能被其他客户端释放;高可用即不必依赖于全部Redis节点正常工作,只要大部分的Redis节点正常运行,客户端就可以进行加锁和解锁操作。本方案中利用了Redis锁对多个服务请求采用串行计算的策略,用Redis的setNX操作的原子性实现分布式锁功能。当多个作业请求需要获取代理资源的执行信息更新的锁时,应用端发送一个setNX命令,如果当前锁存在则不做任何操作,代表有其他作业请求已经获取了该锁,则当前作业请求轮询等待获取代理资源的执行信息的更新权限;如果当前没有锁(key不存在),那么就进行加锁操作,并对锁设置个有效期,同时value表示加锁的客户端。加锁操作满足分布式锁的几个特性。首先,set()加入了NX参数,可以保证如果已有key存在,则函数不会调用成功,也就是只有一个客户端能持有锁,满足互斥性。其次,由于对锁设置了过期时间,即使锁的持有者后续发生崩溃而没有解锁,锁也会因为到了过期时间而自动解锁(即key被删除),不会发生死锁。最后,因为将value赋值为requestId,代表加锁的客户端请求标识,那么在客户端在解锁的时候就可以进行校验是否是同一个客户端。
本方案实现了集群模式下基于Redis的代理资源的调度,即采用Redis存储请求代理资源的作业请求队列,根据先进先出的原则,调度时每次取出队首的作业请求,循环遍历代理资源列表中符合条件的数据代理,根据字符集相同以及每次获取最为空闲的代理的调度规则,结合Redis分布式锁技术,实现了集群模式下高并发时对于共享资源的互斥操作,确保了代理资源的关键执行信息更新时的数据一致性问题,同时队列信息和代理的执行信息等关键信息缓存在Redis中,也提高了访问效率。
图6为本发明提供的基于Redis的作业请求调度装置实施例一的结构示意图;如图6所示,该基于Redis的作业请求调度装置10包括:
处理模块11,用于根据先入先出规则从Redis集群中的作业请求队列中获取待处理的作业请求;
所述处理模块11还用于根据预设的调度规则,从所述Redis集群中存储的代理资源列表中获取目标代理资源,所述目标代理资源对应的字符集与所述作业请求一致和/或所述目标代理资源对应的代理服务器执行的进程最少;
发送模块12,用于将所述作业请求发送至所述目标代理资源对应的代理服务器进行处理,并对所述Redis集群中所述目标代理资源进行锁定。
本实施例提供的基于Redis的作业请求调度装置,用于实现前述任一方法实施例中用于实现管理功能的电子设备侧的技术方案,其实现原理和技术效果类似,预先将代理资源以及作业请求队列等信息存储在Redis中以便实现快速访问,并且在对代理资源进行调度的过程中考虑了字符集一致以及空闲程度,实现了作业请求调度的软负载,有效提升代理资源调度的效率和作业请求执行的效率。
在上述实施例的基础上,在该基于Redis的作业请求调度装置10的一种具体实现中,所述处理模块11还用于:
在确定所述代理服务器将所述作业请求的结果返回对应的应用服务器之后,释放对所述Redis集群中所述目标代理资源的锁定,并从所述作业请求队列的首位移除所述作业请求。
在一种具体实施方式中,所述处理模块11还用于:
在接收到任一应用服务器发送的请求代理资源的作业请求时,根据应用服务器的字符集,将所述作业请求添加至所述Redis集群中与所述字符集对应的作业请求队列的队尾。
在一种具体实施方式中,所述调度规则包括:字符集一致规则和/或执行进程数最少原则,所述代理资源列表中包括多个代理资源,每个代理资源包括:代理字符集,代理服务器的IP地址以及端口。
在一种具体实施方式中,所述处理模块11具体用于:
遍历所述代理资源列表中的每个代理资源,若当前代理资源正在执行的进程数为0或者小于单个代理进程数阈值,则确定当前代理资源为所述目标代理资源;
或者,
遍历所述代理资源列表中的每个代理资源,若当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定当前代理资源为所述目标代理资源。
可选的,所述处理模块11具体用于:
遍历所述代理资源列表中的每个代理资源,若当前代理资源正在执行的进程数大于0,则确定当前代理资源中的代理字符集与所述作业请求对应的字符集是否一致;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定所述当前代理资源正在执行的进程数是否小于单个代理进程数阈值;
若所述当前代理资源正在执行的进程数小于单个代理进程数阈值,则将所述当前代理资源确定为所述目标代理资源;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集不一致,或者,所述当前代理资源正在执行的进程数大于或等于单个代理进程数阈值,则对下一个代理资源进行确定。
可选的,所述处理模块11具体用于:
遍历所述代理资源列表中的每个代理资源,确定当前代理资源中的代理字符集与所述作业请求对应的字符集是否一致;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集一致,则确定所述当前代理资源正在执行的进程数是否小于单个代理进程数阈值;
若所述当前代理资源正在执行的进程数小于单个代理进程数阈值,则将所述当前代理资源确定为所述目标代理资源;
若所述当前代理资源中的代理字符集与所述作业请求对应的字符集不一致,或者,所述当前代理资源正在执行的进程数大于或等于单个代理进程数阈值,则对下一个代理资源进行确定。
可选的,所述Redis集群中设置有多个作业请求队列,每个作业请求队列用于缓存不同的字符集对应的作业请求。
本实施例提供的基于Redis的作业请求调度装置,用于执行前述任一方法实施例中的技术方案,其实现原理和技术效果类似,在此不再赘述。
图7为本发明提供的一种电子设备的结构示意图。如图7所示,该电子设备100包括:
处理器111,存储器112,及通信接口113;
所述存储器112用于存储所述处理器111的可执行指令;
其中,所述处理器111配置为经由执行所述可执行指令来执行前述任一方法实施例中的技术方案。
可选的,存储器112既可以是独立的,也可以跟处理器111集成在一起。
可选的,当所述存储器112是独立于处理器111之外的器件时,所述电子设备100还可以包括:
总线,用于将上述器件连接起来。
该电子设备用于执行前述任一方法实施例提供的技术方案,在具体实现中,该电子设备可以是独立设置的用于调度应用服务器,Redis集群以及资源服务器的设备,也可以是任一应用服务器,本方案对此不做限制。
本发明实施例还提供一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现前述任一实施例提供的基于Redis的作业请求调度方法。
本发明实施例还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时用于实现前述任一方法实施例提供的基于Redis的作业请求调度方法。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或对其中部分或全部技术特征进行等同替换;而这些修改或替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
- 基于Redis的作业请求调度方法、装置、设备及介质
- 基于机器学习的作业调度优化方法、装置、设备及介质