基于多进程/线程的配置请求处理方法及装置
文献发布时间:2024-04-18 19:58:30
技术领域
本发明涉及计算机技术领域,尤其涉及一种基于多进程/线程的配置请求处理方法及装置。
背景技术
统一数据交互服务系统可以作为公司数据路由中枢,承担着高效、稳定、安全的数据服务,为公司各个业务系统提供数据访问服务。为了保证统一数据交互服务系统稳定性和数据安全性,需要做到对请求方系统身份的知晓,以及对其请求量的预估、可控。对此,可以设计业务处理前置校验逻辑,设计的基本思想是基于网际互连协议(InternetProtocol,IP)白名单校验思想,即给请求方系统的IP绑定一个令牌(token),请求方系统在每次请求时,都需要携带该token,在校验通过后方可允许进行相应数据的调用。
随着业务的扩展,本发明发现请求方系统可能会不定时扩展集群,即新增调用的机器,这些新加入调用集群的机器在我方没有为其配置IP白名单而调用我方的接口时,将由于无法通过权限校验,而遭到拒绝服务。
目前,请求方通常通过线下向我方提出新增机器IP白名单配置的请求,然后由我方手动新增配置实现调用方调用集群机器的扩展,但会存在以下问题:(1)人工运维成本高;(2)周期长;(3)受工作时间的限制。
发明内容
本发明提供一种基于多进程/线程的配置请求处理方法及装置,用以解决现有技术中人工运维成本高、周期长、受工作时间的限制等问题。
本发明提供一种基于多进程/线程的配置请求处理方法,包括:
响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息;其中,所述键信息与所述目标机器相关联;
在判定在所述数据库中不存在所述键信息的情况下,在所述数据库中添加所述键信息,输出表征当前进程/线程锁占用成功的第一信息;其中,所述当前进程/线程与所述配置请求信息相关联;
在判定在所述数据库中已经存在所述键信息的情况下,输出表征其他进程/线程已占用锁、所述当前进程/线程锁占用失败的第二信息;其中,所述其他进程/线程为除所述当前进程/线程外所述键信息对应的其他进程/线程;
响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理。
根据本发明提供的一种基于多进程/线程的配置请求处理方法,所述响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理,包括:
响应于所述第一信息,利用占用的锁对所述目标机器执行向所述数据库添加目标临时白名单配置的操作;其中,所述目标临时白名单配置与所述目标机器相关联。
根据本发明提供的一种基于多进程/线程的配置请求处理方法,在所述利用占用的锁对所述目标机器执行向所述数据库添加目标临时白名单配置的操作之前,所述方法还包括:
查询所述数据库中是否已经存在所述目标临时白名单配置;
所述利用占用的锁对所述目标机器执行向所述数据库添加目标临时白名单配置的操作,包括:
在查询到所述数据库中不存在所述目标临时白名单配置的情况下,利用占用的锁对所述目标机器执行向所述数据库添加所述目标临时白名单配置的操作。
根据本发明提供的一种基于多进程/线程的配置请求处理方法,所述方法还包括:
在查询到所述数据库中已经存在所述目标临时白名单配置的情况下,释放占用的锁。
根据本发明提供的一种基于多进程/线程的配置请求处理方法,所述配置请求信息还包括占用锁的自动过期时间;
所述方法还包括:
在开始占用锁的同时,启动预先设置的计时器;
判断所述计时器距所述自动过期时间的剩余时间是否小于第一阈值;
在判定所述剩余时间小于所述第一阈值的情况下,判断所述添加目标临时白名单配置的操作是否已经完成;
在判定所述添加目标临时白名单配置的操作未完成的情况下,基于预先设置的有效续命时长更新所述自动过期时间,返回所述判断所述计时器距所述自动过期时间的剩余时间是否小于第一阈值的步骤,直至更新所述自动过期时间的次数大于第二阈值,释放占用的锁;
在判定所述添加目标临时白名单配置的操作已经完成的情况下,释放占用的锁。
根据本发明提供的一种基于多进程/线程的配置请求处理方法,所述有效续命时长通过以下步骤获取:
基于守护进程/线程每次续命增加的第一时长t1、续命的时间间隔Δt和连接到所述数据库并执行续命操作的第二时长t2,采用公式(1)计算所述有效续命时长t:
t = t1-Δt- t2 (1)。
根据本发明提供的一种基于多进程/线程的配置请求处理方法,所述在判定所述添加目标临时白名单配置的操作已经完成的情况下,释放占用的锁,包括:
在判定所述添加目标临时白名单配置的操作已经完成的情况下,判断占用的锁对应的键信息在所述数据库中是否存在;
在判定占用的锁对应的键信息在所述数据库中存在的情况下,删除所述占用的锁对应的键信息;
在判定占用的锁对应的键信息在所述数据库中不存在的情况下,对所述添加目标临时白名单配置的操作执行回滚操作。
根据本发明提供的一种基于多进程/线程的配置请求处理方法,所述响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理,包括:
响应于所述第二信息,对所述目标机器执行以下至少一项操作:
终止处理所述配置请求信息,输出提示稍后重试的第三信息;
间隔第三时长后,返回执行所述判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息的步骤,直至判定在所述数据库中不存在所述键信息;
间隔第四时长后,返回执行所述判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息的步骤,在返回执行的次数大于或等于第三阈值的情况下,终止处理所述配置请求信息。
根据本发明提供的一种基于多进程/线程的配置请求处理方法,所述数据库包括Redis库;
所述响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息,包括:
响应于所述配置请求信息,利用LUA脚本判断在所述Redis库中是否已经存在所述键信息。
本发明还提供一种基于多进程/线程的配置请求处理装置,包括:
判断模块,用于响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息;其中,所述键信息与所述目标机器相关联;
第一输出模块,用于在判定在所述数据库中不存在所述键信息的情况下,在所述数据库中添加所述键信息,输出表征当前进程/线程锁占用成功的第一信息;其中,所述当前进程/线程与所述配置请求信息相关联;
第二输出模块,用于在判定在所述数据库中已经存在所述键信息的情况下,输出表征其他进程/线程已占用锁、所述当前进程/线程锁占用失败的第二信息;其中,所述其他进程/线程为除所述当前进程/线程外所述键信息对应的其他进程/线程;
处理模块,用于响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述基于多进程/线程的配置请求处理方法。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述基于多进程/线程的配置请求处理方法。
本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述基于多进程/线程的配置请求处理方法。
本发明提供的基于多进程/线程的配置请求处理方法及装置,响应于针对目标机器的配置请求信息,先判断在数据库中是否已经存在该配置请求信息中的键信息,该键信息与目标机器相关联,例如与目标机器的IP存在对应关系,这里可以理解为是在判断当前是否已经有该目标机器对应的处理进程/线程,如果数据库中不存在该键信息,则认为当前没有该目标机器对应的处理进程/线程,可以占用锁,即占用了该目标机器临时白名单的添加权,并输出当前进程/线程锁占用成功的第一信息,此时该目标机器对应其他配置请求信息则无法再占用处理进程/线程进行临时白名单的添加;同理,如果数据库中存在该键信息,说明当前已经有该目标机器对应的处理进程/线程,则输出其他进程/线程已占用锁、当前进程/线程锁占用失败的第二信息,最后响应于第一信息或第二信息,对配置请求信息进行对应的处理。相较于相关技术通过手动新增配置实现调用方调用集群机器的扩展,本发明实施例可以适用于多进程/线程的场景,响应于目标机器的配置请求信息对配置请求信息进行相应处理,可以对例如目标机器的临时白名单进行配置,减少了人工运维成本和配置周期,不再受人工工作时间的限制,另外,通过分布式锁的思路,可以避免对目标机器临时白名单的重复配置,有效节约了配置临时白名单的处理资源和数据库资源。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的基于多进程/线程的配置请求处理方法的流程示意图;
图2是本发明提供的基于多进程/线程的配置请求处理装置的结构示意图;
图3是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面结合附图描述本发明的基于多进程/线程的配置请求处理方法及装置。
图1是本发明提供的基于多进程/线程的配置请求处理方法的流程示意图,如图1所示,该方法包括步骤101至步骤104;其中:
步骤101、响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息;其中,所述键信息与所述目标机器相关联。
步骤102、在判定在所述数据库中不存在所述键信息的情况下,在所述数据库中添加所述键信息,输出表征当前进程/线程锁占用成功的第一信息;其中,所述当前进程/线程与所述配置请求信息相关联。
步骤103、在判定在所述数据库中已经存在所述键信息的情况下,输出表征其他进程/线程已占用锁、所述当前进程/线程锁占用失败的第二信息;其中,所述其他进程/线程为除所述当前进程/线程外所述键信息对应的其他进程/线程。
步骤104、响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理。
需要说明的是,步骤102和步骤103为步骤101中判断步骤的两种判定结果分别对应的步骤,故在此不限制执行步骤102和步骤103的先后顺序。
相关技术中,请求方通常通过线下向我方提出新增机器IP白名单配置的请求,然后由我方手动新增配置实现调用方调用集群机器的扩展,但会存在以下问题:(1)人工运维成本高;(2)周期长;(3)受工作时间的限制。
为解决上述问题,本发明实施例提出通过设计一些安全校验策略,对新增的机器可以实现自动添加IP临时白名单的方式,让请求方可以实时自动扩展调用集群,从而提高调用方的业务能力,尽可能小地影响业务处理。
但是,这样就会出现一个场景,即调用方的一台机器,在短时间内可能发出多个请求,这多个请求分别通过一定的负载均衡策略,分发到我方的多个IP白名单认证服务应用节点上进行认证,由于请求方的这台机器事先没有配置过IP白名单,这样新增的这台机器发出的多个请求,在多个认证服务节点上通过自动添加策略的校验后,就可能会同时尝试添加这一台机器的多个相同的IP白名单配置,这是情况是不希望看到的。
另外,对系统数据进行操作的时候,可以控制同一时间只能由一个进程/线程来操作,即数据处理加锁,对于多节点的应用即是分布式锁。相关的技术方案包括:
(1)Java.util.concurrent(JUC)包中的同步(synchronized)关键字,或者可重入锁(ReentrantLock)。JUC是Java原生的并发包和一些常用的工具类,是互联网技术(Internet Technology,IT)领域的公知技术。
该方案只能保证单个应用内进程/线程,即单进程/线程内的顺序执行,不支持单机多进程/线程,更不支持多机多进程/线程的分布式场景。
(2)ZooKeeper分布式锁。
该方案每次在创建锁和释放锁的过程中,都要动态创建、销毁临时节点来实现锁功能,创建和删除节点只能通过领导者(Leader)服务器来执行,Leader服务器还需要将数据同步到所有的跟随者(Follower)机器上,这样频繁的网络通信,性能不高的问题突出。
(3)基于数据库的分布式锁。
该方案受限于数据库的类型,并不是所有的数据库都支持互斥特性,需要提前向锁(lock)表中插入资源锁的数据,然后获取/尝试/释放锁的应用程序编程接口(Application Programming Interface,API)才能按预期工作。
本发明实施例提供了一种基于多进程/线程的配置请求处理方法,可以控制在多机器、多节点的情况下,同一时间只能由一个进程/线程来处理同一条数据。
需要说明的是,这里进程和线程之间的数量关系,可以是一对一或一对多的关系,即一个进程包括一个线程,或者一个进程包括多个线程。
具体地,本发明实施例先接收针对目标机器的配置请求信息,配置请求信息可以包括与目标机器相关联的键信息Key,目标机器可以理解为是新增的机器,需要将其添加至IP临时白名单配置中。
在一些实施例中,例如Redis库的存储方式是键-值(Key-Value),则配置请求信息还可以包括值信息Value,可以使用包括当前目标机器的IP、端口(PORT)、当前进程/线程标识(Identity,ID)的一个JS对象简谱(JavaScript Object Notation,JSON)字符串,有了这三个参数后应用节点即可向Redis库发出请求。
响应于针对目标机器的配置请求信息,需要判断在数据库中是否已经存在该配置请求信息中的键信息,该键信息与目标机器相关联,例如与目标机器的IP存在对应关系,这里可以理解为是在判断当前是否已经有该目标机器对应的处理进程/线程。
如果数据库中不存在该键信息,则认为当前没有该目标机器对应的处理进程/线程,可以占用锁,即占用该目标机器临时白名单的添加权,并输出所占用成功的第一信息,此时该目标机器对应其他配置请求信息则无法再占用处理进程/线程进行临时白名单的添加。
同理,如果数据库中存在该键信息,说明当前已经有该目标机器对应的处理进程/线程,则输出锁占用失败的第二信息。
再响应于第一信息或第二信息,对配置请求信息进行对应的处理。
可选地,所述数据库可以包括Redis库;
所述响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息的实现方式可以包括:
响应于所述配置请求信息,利用LUA脚本判断在所述Redis库中是否已经存在所述键信息。
具体地,由于在Redis库运行LUA脚本是原子性的,其保证了同一时间内只能有一个应用节点可以成功占用锁,进而获取目标机器临时白名单的添加权,避免了由于多个应用节点几乎同时尝试添加同一台目标机器的临时白名单配置,而导致数据库的白名单配置中存在多个相同IP的临时白名单配置,即避免了重复配置的情况,进一步节约了配置临时白名单的处理资源和数据库资源。
在本发明实施例提供的基于多进程/线程的配置请求处理方法中,相较于相关技术通过手动新增配置实现调用方调用集群机器的扩展,本发明实施例可以适用于多进程/线程的场景,响应于目标机器的配置请求信息对配置请求信息进行相应处理,可以对例如目标机器的临时白名单进行配置,减少了人工运维成本和配置周期,不再受人工工作时间的限制,另外,通过分布式锁的思路,可以避免对目标机器临时白名单的重复配置,有效节约了配置临时白名单的处理资源和数据库资源。
可选地,所述响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理的实现方式可以包括:
响应于所述第一信息,利用占用的锁对所述目标机器执行向所述数据库添加目标临时白名单配置的操作;其中,所述目标临时白名单配置与所述目标机器相关联。
具体地,若输出第一信息,则说明当前进程/线程对应的锁占用成功,此时可以利用已占用的锁对应的当前进程/线程,对目标机器执行向数据库添加目标临时白名单配置的操作,添加的目标临时白名单配置与目标机器相关联,进而请求方可以通过目标临时白名单配置对目标机器进行校验,进而调用目标机器。
可选地,在所述利用占用的锁对所述目标机器执行向所述数据库添加目标临时白名单配置的操作之前,可以查询所述数据库中是否已经存在所述目标临时白名单配置;
所述利用占用的锁对所述目标机器执行向所述数据库添加目标临时白名单配置的操作的实现方式可以包括:
在查询到所述数据库中不存在所述目标临时白名单配置的情况下,利用占用的锁对所述目标机器执行向所述数据库添加所述目标临时白名单配置的操作。
可选地,可以在查询到所述数据库中已经存在所述目标临时白名单配置的情况下,释放占用的锁。
具体地,在当前进程/线程锁占用成功之后,由于不知道当前进程/线程是不是第一个抢占到锁的进程/线程,可以理解为不知道目标机器的目标临时白名单配置已配置好,因此还需要判断调用方目标机器是已经被其他进程/线程添加过IP白名单配置,故可以根据IP以及其他能唯一确定一条配置(目标临时白名单配置)查询数据库,可以存在以下两种情况:
(1)能查询到目标临时白名单配置,则说明目标机器的白名单配置已经被其他进程/线程添加过,此时可以释放占用的锁;
(2)未查询到目标临时白名单配置,说明目标机器的白名单配置还未成功添加过,此时可以构建目标临时白名单配置,添加目标临时白名单配置到数据库,完成之后可以释放占用的锁。
可选地,所述配置请求信息还包括占用锁的自动过期时间;
可以在开始占用锁的同时,启动预先设置的计时器;
判断所述计时器距所述自动过期时间的剩余时间是否小于第一阈值;
在判定所述剩余时间小于所述第一阈值的情况下,判断所述添加目标临时白名单配置的操作是否已经完成;
在判定所述添加目标临时白名单配置的操作未完成的情况下,基于预先设置的有效续命时长更新所述自动过期时间,返回所述判断所述计时器距所述自动过期时间的剩余时间是否小于第一阈值的步骤,直至更新所述自动过期时间的次数大于第二阈值,释放占用的锁;
在判定所述添加目标临时白名单配置的操作已经完成的情况下,释放占用的锁。
具体地,为了避免在应用节点占用锁成功,但是处理过程中由于应用节点崩溃而造成死锁,本发明实施例可以给Key设置一个自动过期时间(expireTime),假定为etKeyNC,该时间的时长与具体业务处理时长相关,可以根据实际情况进行设置,并将该自动过期时间配置在配置请求信息。
分布式锁占用成功后,在接下来进行业务处理前,需要保证业务处理过程中,锁不会过期失效。
具体地,在成功开始占用锁的同时,可以开始启动预先设置的计时器,计时器在添加目标临时白名单配置操作的过程中一直处于计时状态,实时判断计时器距自动过期时间之间的剩余时间是否小于第一阈值,在判定剩余时间小于第一阈值的情况下,需要判断添加目标临时白名单配置的操作是否已经完成;
若判定添加目标临时白名单配置的操作还未完成,则可以对已占用的锁进行续命,以延长其对应的自动过期时间,具体可以基于预先设置的有效续命时长更新自动过期时间,再返回判断计时器距自动过期时间的剩余时间是否小于第一阈值的步骤,继续判断自动过期时间是否即将到期。
可选地,可以设置续命总次数(resetExpireTemeTotalCount),以限制续命的总次数,续命总次数是考虑到主进程/线程异常崩溃导致的死锁问题,如果主进程/线程一直不能处理结束,不能主动释放锁,而守护进程/线程又不停的续命,将会导致死锁问题,可以指定一个足够主业务处理完成的续命次数,建议为5倍以上10倍以下。例如,可以设置续命总次数为第二阈值,不断续命直至更新自动过期时间的次数大于第二阈值,可以释放占用的锁。
若判定添加目标临时白名单配置的操作已经完成,则可以释放占用的锁。
可选地,所述有效续命时长可以通过以下步骤获取:
基于守护进程/线程每次续命增加的第一时长t1、续命的时间间隔Δt和连接到所述数据库并执行续命操作的第二时长t2,采用公式(1)计算所述有效续命时长t:
t = t1-Δt- t2 (1)。
具体地,可以先获取每次续命增加的时长(resetExpireTime)的具体取值t1,续命的时间间隔(resetExpireTimeInterval)的具体取值Δt,子进程/线程每次连接到Redis库以及Redis库执行续命操作的时长(excuteResetTime)的具体取值t2。
需要说明的是,每次续命的时间间隔resetExpireTimeInterval和每次续命的时长resetExpireTime之间的关系,如果续命的时间过短,而续命的时间间隔过长,则会导致还没有完成续命而锁已经过期,要保证这个安全问题,需要满足如下关系:
resetExpireTime>resetExpireTimeInterval+excuteResetTime。
如果要保证足够长的续命时间以及避免死锁,若同时考虑resetExpireTemeTotalCount,则需要满足如下关系:
etKeyNC*5[*2]=(resetExpireTime-resetExpireTimeInterval-excuteResetTime)*resetExpireTemeTotalCount。
其中,*5[*2]表征经验值可以设置为5~10倍。
可选地,所述在判定所述添加目标临时白名单配置的操作已经完成的情况下,释放占用的锁的实现方式可以包括:
在判定所述添加目标临时白名单配置的操作已经完成的情况下,判断占用的锁对应的键信息在所述数据库中是否存在;
在判定占用的锁对应的键信息在所述数据库中存在的情况下,删除所述占用的锁对应的键信息;
在判定占用的锁对应的键信息在所述数据库中不存在的情况下,对所述添加目标临时白名单配置的操作执行回滚操作。
具体地,在添加目标临时白名单配置的操作已经完成的情况下,需要对占用的锁进行主动释放,此时可以分为如下两种情况:
(1)如果占用的锁对应的键信息还存在,则可以得到数据正常删除的信号,可以正常结束;
(2)如果得到占用的锁对应的键信息不存在的信号,说明占用的锁已经提前过期,此时可能锁已经被其他进程/线程再次获取,有重复添加目标临时白名单配置的风险,故可以设置当前进程/线程回滚数据库中的添加操作,还可以返回添加异常,并提示重试的信息。
可选地,所述响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理的实现方式可以包括:
响应于所述第二信息,对所述目标机器执行以下至少一项操作:
1)终止处理所述配置请求信息,输出提示稍后重试的第三信息;
具体地,若判定得到第二信息,则可以认为锁抢占失败,直接终止处理,返回失败原因,并提示稍后重试。
2)间隔第三时长后,返回执行所述判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息的步骤,直至判定在所述数据库中不存在所述键信息;
具体地,可以隔一段时间重试一次,例如间隔第三时长后重试,直至重试获取分布式锁成功转至分布式锁获取成功的处理流程即可。
3)间隔第四时长后,返回执行所述判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息的步骤,在返回执行的次数大于或等于第三阈值的情况下,终止处理所述配置请求信息。
具体地,可以隔一段时间重试一次并指定重试的次数,例如间隔第四时长后重试,如果到达指定重试次数(大于或等于第三阈值)还未成功,则终止处理,返回失败原因,并提示稍后重试。可选地,如果在指定的次数内获取成功,则可以直接转至获取成功的处理流程。
下面举例说明本发明实施例提供的基于多进程/线程的配置请求处理方法。
假设调用方新增加了一台机器(New Computer,NC),针对该NC在极短的时间内发出了两个请求:请求A(Request A,RA)、请求B(Request B,RB),这两个请求同时到达了我方的两个应用节点:应用节点1(Application Node 1,AN1)、应用节点2(Application Node2,AN2)上,然后在几乎相同的时刻识别发现没有该NC机器的白名单配置,且NC符合自动添加白名单的条件,此时AN1、AN2都可以尝试向数据库中添加NC的临时白名单配置。
(一)第一步:为了避免AN1、AN2重复添加NC的白名单配置,可以先尝试获取和占用锁,以占用NC机器临时白名单配置的添加权,AN1、AN2可以使用相同的策略生成一个和NC机器IP相关联的相同的Key,可以假设为:DISTRIBUTE_LOCK:::NC_IP。
另外,为了避免在AN1或者AN2占用锁成功,但是处理过程中由于应用崩溃而造成死锁,本申请可以给Key设置一个自动过期时间,假定为etKeyNC,该时间的时长与具体业务处理时长相关,本发明实施例中,该时长是与向数据库中添加一次机器IP白名单配置所花费的时间相关,这个时间可以通过测试得到,通过多次添加取平均值。可以假设向数据库中添加一条IP白名单配置所花费时间为1000ms,即etKeyNC=1000。
由于Redis库的存储方式是Key-Value,因此还需要设置一个Value,本发明实施例使用的是包含当前机器(AN1或者AN2)的IP、PORT、当前进程/线程ID的一个JSON字符串,有了这三个参数后AN1、AN2即可向Redis库发出请求,请求中可以包括四个信息,除了包括上述的三个信息:键_DISTRIBUTE_LOCK:::NC_IP、值_JSON字符串、自动过期时间_etKeyNC,还可以包括一段LUA脚本。
LUA脚本是在Redis端运行的脚本,是原子化的,该脚本的处理流程为:判断键DISTRIBUTE_LOCK:::NC_IP是否已经存在。
如果存在,则直接返回被占用标记01;
如果不存在,则添加键和值DISTRIBUTE_LOCK:::NC_IP、JSON字符串,并设置etKeyNC为1000ms的自动过期时间,然后返回占用成功标记02。
由于Redis运行LUA脚本是原子性的,因此AN1和AN2的请求只能有一个抢占成功,此处假设请求RA成功、请求RB抢占失败,接下来阐述分布式锁获取成功和失败后分别如何处理。
(二)第二步:根据分布式锁获取成功或失败有不同的处理流程:
(1)分布式锁获取失败后有三种处理方式:
第一种:抢占失败,直接终止处理,返回失败原因,并提示稍后重试。
第二种:隔一段时间重试一次,直至重试获取分布式锁成功转至分布式锁获取成功的处理流程。
第三种:隔一段时间重试一次并指定重试的次数,如果到达指定重试次数还未成功,则终止处理,返回失败原因,并提示稍后重试;如果指定的次数内获取成功,直接转至获取成功的处理流程。
(2)分布式锁获取成功,在接下来进行业务处理前,需要保证业务处理过程中,锁不会过期失效。
本发明实施例的解决方案是:启动一个子进程/线程,用来守护主进程/线程的业务处理,当主业务正在处理过程中,而锁已经快要过期的情况下,守护进程/线程主动为锁进行续命。
设置续命的时间间隔resetExpireTimeInterval,每次续命增加的时长resetExpireTime,续命总次数resetExpireTemeTotalCount。续命总次数是考虑到主进程/线程异常崩溃导致的死锁问题,如果主进程/线程一直不能处理结束,不能主动释放锁,而守护进程/线程又不停的续命,将会导致死锁问题,指定一个足够主业务处理完成的续命次数,建议为5倍以上10倍以下。还有就是每次续命的时间间隔resetExpireTimeInterval和每次续命的时长resetExpireTime之间的关系,如果续命的时间过短,而时间间隔过长,则会导致还没有续命则锁已经过期,这个时间间隔要考虑子进程/线程每次连接到Redis以及Redis执行续命操作的时长,假设该时长为excuteResetTime,要保证这个安全问题需满足如下关系:
resetExpireTime>resetExpireTimeInterval+excuteResetTime。
要保证足够长的续命时间以及避免死锁,需要满足如下关系:
etKeyNC*5[*2]=(resetExpireTime-resetExpireTimeInterval-excuteResetTime)*resetExpireTemeTotalCount。
在正常情况下,主进程/线程在未达到最大续命次数时,就能够处理完成,随后主进程/线程会主动释放锁,即删除键DISTRIBUTE_LOCK:::NC_IP,当守护进程/线程再次续命的时候,将会得到键不存在的信号,此时,续命进程/线程即可结束使命,跳出循环,结束守护进程/线程;当守护进程/线程达到最大续命次数时,仍然没有主进程/线程正常处理完成的信号,守护进程/线程则主动结束循环,可以认为此时主进程/线程已经出现问题,让锁自动过期释放。
(三)第三步:主业务处理。
在锁占用成功之后,由于不知道当前进程/线程是不是第一个抢占到锁的进程/线程,因此需要判断调用方新增的NC是否已经被其他进程/线程添加过IP白名单配置,故需要根据IP以及其他能唯一确定一条配置查询数据库,存在有两种情况:
(1)能查询到NC的配置信息,则说明新增的NC已经被其他进程/线程添加过,此时转至第四步。
(2)未查询到NC的配置信息,说明新增的NC的白名单配置信息还未成功添加过,此时构建配置信息添加一条NC的白名单配置信息到数据库,完成之后,转至第四步释放锁。
(四)第四步:释放占用的锁,可以分为主动释放和被动释放:
1、主动释放,即请求Redis删除键DISTRIBUTE_LOCK:::NC_IP,守护进程/线程再次续命的时候,会发现主进程/线程业务处理完成的信号,终止续命,并结束守护进程/线程,删除键的时候,删除结果可能有以下两种:
1)如果键还存在,则可以得到Redis正常删除的信号,可以正常结束。
2)如果得到键不存在的信号,说明锁已经提前过期,此时可能锁已经被其他进程/线程再次获取,有重复添加的风险,因此当前进程/线程需要回滚数据库的添加操作,并返回添加异常,并提示重试的信息。
2、被动释放,即主进程/线程崩溃,守护进程/线程一直得不到主业务处理完成的信号,当续命到指定的次数后,将跳出循环,不再续命,让锁自动过期释放。
下面对本发明提供的基于多进程/线程的配置请求处理装置进行描述,下文描述的基于多进程/线程的配置请求处理装置与上文描述的基于多进程/线程的配置请求处理方法可相互对应参照。
图2是本发明提供的基于多进程/线程的配置请求处理装置的结构示意图,如图2所示,基于多进程/线程的配置请求处理装置200包括:
判断模块201,用于响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息;其中,所述键信息与所述目标机器相关联;
第一输出模块202,用于在判定在所述数据库中不存在所述键信息的情况下,在所述数据库中添加所述键信息,输出表征当前进程/线程锁占用成功的第一信息;其中,所述当前进程/线程与所述配置请求信息相关联;
第二输出模块203,用于在判定在所述数据库中已经存在所述键信息的情况下,输出表征其他进程/线程已占用锁、所述当前进程/线程锁占用失败的第二信息;其中,所述其他进程/线程为除所述当前进程/线程外所述键信息对应的其他进程/线程;
处理模块204,用于响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理。
在本发明实施例提供的基于多进程/线程的配置请求处理装置中,判断模块响应于针对目标机器的配置请求信息,先判断在数据库中是否已经存在该配置请求信息中的键信息,该键信息与目标机器相关联,例如与目标机器的IP存在对应关系,这里可以理解为是在判断当前是否已经有该目标机器对应的处理进程/线程,如果数据库中不存在该键信息,则认为当前没有该目标机器对应的处理进程/线程,可以占用锁,即占用了该目标机器临时白名单的添加权,并由第一输出模块输出当前进程/线程锁占用成功的第一信息,此时该目标机器对应其他配置请求信息则无法再占用处理进程/线程进行临时白名单的添加;同理,如果数据库中存在该键信息,说明当前已经有该目标机器对应的处理进程/线程,则由第二输出模块输出其他进程/线程已占用锁、当前进程/线程锁占用失败的第二信息,最后由处理模块响应于第一信息或第二信息,对配置请求信息进行对应的处理。相较于相关技术通过手动新增配置实现调用方调用集群机器的扩展,本发明实施例可以适用于多进程/线程的场景,响应于目标机器的配置请求信息对配置请求信息进行相应处理,可以对例如目标机器的临时白名单进行配置,减少了人工运维成本和配置周期,不再受人工工作时间的限制,另外,通过分布式锁的思路,可以避免对目标机器临时白名单的重复配置,有效节约了配置临时白名单的处理资源和数据库资源。
可选地,处理模块204具体用于:响应于所述第一信息,利用占用的锁对所述目标机器执行向所述数据库添加目标临时白名单配置的操作;其中,所述目标临时白名单配置与所述目标机器相关联。
可选地,处理模块204还用于:
查询所述数据库中是否已经存在所述目标临时白名单配置;
在查询到所述数据库中不存在所述目标临时白名单配置的情况下,利用占用的锁对所述目标机器执行向所述数据库添加所述目标临时白名单配置的操作。
可选地,处理模块204还用于:在查询到所述数据库中已经存在所述目标临时白名单配置的情况下,释放占用的锁。
可选地,所述配置请求信息还包括占用锁的自动过期时间;
处理模块204还用于:
在开始占用锁的同时,启动预先设置的计时器;
判断所述计时器距所述自动过期时间的剩余时间是否小于第一阈值;
在判定所述剩余时间小于所述第一阈值的情况下,判断所述添加目标临时白名单配置的操作是否已经完成;
在判定所述添加目标临时白名单配置的操作未完成的情况下,基于预先设置的有效续命时长更新所述自动过期时间,返回所述判断所述计时器距所述自动过期时间的剩余时间是否小于第一阈值的步骤,直至更新所述自动过期时间的次数大于第二阈值,释放占用的锁;
在判定所述添加目标临时白名单配置的操作已经完成的情况下,释放占用的锁。
可选地,所述有效续命时长通过以下步骤获取:
基于守护进程/线程每次续命增加的第一时长t1、续命的时间间隔Δt和连接到所述数据库并执行续命操作的第二时长t2,采用公式(1)计算所述有效续命时长t:
t = t1-Δt- t2 (1)。
可选地,处理模块204还具体用于:
在判定所述添加目标临时白名单配置的操作已经完成的情况下,判断占用的锁对应的键信息在所述数据库中是否存在;
在判定占用的锁对应的键信息在所述数据库中存在的情况下,删除所述占用的锁对应的键信息;
在判定占用的锁对应的键信息在所述数据库中不存在的情况下,对所述添加目标临时白名单配置的操作执行回滚操作。
可选地,处理模块204还具体用于:
响应于所述第二信息,对所述目标机器执行以下至少一项操作:
1)终止处理所述配置请求信息,输出提示稍后重试的第三信息;
2)间隔第三时长后,返回执行所述判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息的步骤,直至判定在所述数据库中不存在所述键信息;
3)间隔第四时长后,返回执行所述判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息的步骤,在返回执行的次数大于或等于第三阈值的情况下,终止处理所述配置请求信息。
可选地,所述数据库包括Redis库;
判断模块201具体用于:响应于所述配置请求信息,利用LUA脚本判断在所述Redis库中是否已经存在所述键信息。
图3是本发明提供的电子设备的结构示意图,如图3所示,该电子设备300可以包括:处理器(processor)310、通信接口(Communications Interface)320、存储器(memory)330和通信总线340,其中,处理器310,通信接口320,存储器330通过通信总线340完成相互间的通信。处理器310可以调用存储器330中的逻辑指令,以执行基于多进程/线程的配置请求处理方法,该方法包括:
响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息;其中,所述键信息与所述目标机器相关联;
在判定在所述数据库中不存在所述键信息的情况下,在所述数据库中添加所述键信息,输出表征当前进程/线程锁占用成功的第一信息;其中,所述当前进程/线程与所述配置请求信息相关联;
在判定在所述数据库中已经存在所述键信息的情况下,输出表征其他进程/线程已占用锁、所述当前进程/线程锁占用失败的第二信息;其中,所述其他进程/线程为除所述当前进程/线程外所述键信息对应的其他进程/线程;
响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理。
此外,上述的存储器330中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行时,计算机能够执行上述各方法所提供的基于多进程/线程的配置请求处理方法,该方法包括:
响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息;其中,所述键信息与所述目标机器相关联;
在判定在所述数据库中不存在所述键信息的情况下,在所述数据库中添加所述键信息,输出表征当前进程/线程锁占用成功的第一信息;其中,所述当前进程/线程与所述配置请求信息相关联;
在判定在所述数据库中已经存在所述键信息的情况下,输出表征其他进程/线程已占用锁、所述当前进程/线程锁占用失败的第二信息;其中,所述其他进程/线程为除所述当前进程/线程外所述键信息对应的其他进程/线程;
响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法提供的基于多进程/线程的配置请求处理方法,该方法包括:
响应于针对目标机器的配置请求信息,判断在预先设置的数据库中是否已经存在所述配置请求信息中的键信息;其中,所述键信息与所述目标机器相关联;
在判定在所述数据库中不存在所述键信息的情况下,在所述数据库中添加所述键信息,输出表征当前进程/线程锁占用成功的第一信息;其中,所述当前进程/线程与所述配置请求信息相关联;
在判定在所述数据库中已经存在所述键信息的情况下,输出表征其他进程/线程已占用锁、所述当前进程/线程锁占用失败的第二信息;其中,所述其他进程/线程为除所述当前进程/线程外所述键信息对应的其他进程/线程;
响应于所述第一信息或所述第二信息,对所述配置请求信息进行对应的处理。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
- 基于消息队列的请求处理方法、装置、设备及存储介质
- 基于贷款系统的请求处理方法、装置和计算机设备
- 一种发送调度请求及调度请求失败后的配置方法及装置
- 基于多进程的任务请求处理方法、装置和系统
- 基于配置文件的请求处理方法、装置、设备及存储介质