一种高可用线程池切换方法及装置转让专利

申请号 : CN202210972026.7

文献号 : CN115080247B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 童跃张学亮唐华

申请人 : 科来网络技术股份有限公司

摘要 :

本发明公开了一种高可用线程池切换方法及装置,包括:从动态线程池工厂获取主线程池,并检测主线程池的状态;根据主线程池的状态,切换至不同的线程池执行新接收的任务,包括:当主线程池的状态为确定阻塞状态时,则从主线程池切换至备用线程池为新接收的任务提供服务,同时启动主线程池脏任务识别机制进行脏任务识别,并将识别出的脏任务置于脏任务资源受限线程池中执行;当脏任务识别完成后,开启定时任务;根据定时任务检测主线程池的最新状态,如果主线程池的最新状态为恢复完成状态,则由备用线程池切换至原主线程池为新接收的任务提供服务。本发明能够解决当多个任务共用一个线程池时,其中某个任务耗时拖延,从而导致整体卡顿的问题。

权利要求 :

1.一种高可用线程池切换方法,其特征在于,该方法包括:从动态线程池工厂获取主线程池,并检测所述主线程池的状态;

根据所述主线程池的状态,切换至不同的线程池执行新接收的任务,包括:当所述主线程池的状态为确定阻塞状态时,则从主线程池切换至备用线程池为新接收的任务提供服务,同时启动主线程池脏任务识别机制进行脏任务识别,并将识别出的脏任务置于脏任务资源受限线程池中执行;

当所述脏任务识别完成后,开启定时任务;根据所述定时任务检测所述主线程池的最新状态,如果所述主线程池的最新状态为恢复完成状态,则由备用线程池切换至原主线程池为新接收的任务提供服务;

所述主线程池的状态包括正常状态、疑似阻塞状态、确定阻塞状态、恢复中状态和恢复完成状态;

所述主线程池的状态的判断依据为:

如果所述主线程池中的阻塞块大小为0或者使用的阻塞块在阻塞队列总容量中的占比不超过第一预设值时,那么所述主线程池为正常状态;

如果所述主线程池中的阻塞块大小不为0,且使用的阻塞块在阻塞队列总容量中的占比超过第一预设值时,所述主线程池陷入繁忙,将所述主线程池状态置为疑似阻塞状态;

每次获取所述主线程池时,对所述主线程池的疑似阻塞状态进行记录,记录累计繁忙次数;当所述累计繁忙次数达到第二预设值时,将所述主线程池状态置为确定阻塞状态;

根据确定阻塞状态后,启动主线程池脏任务识别机制进行脏任务识别,当所述脏任务识别完成后,开启定时任务,那么所述主线程池处于恢复中,将所述主线程池状态置为恢复中状态;直至恢复完成,将所述主线程池状态置为恢复完成状态;

所述脏任务指的是在主线程池中占比最多且耗时最多的任务。

2.根据权利要求1所述的一种高可用线程池切换方法,其特征在于,该方法还包括动态线程池工厂的初始化,具体为:设置动态线程池工厂,线程池获取必须经过统一调度入口;所述动态线程池工厂为多任务共用线程池;

初始化备用线程池,初始化脏任务资源受限线程池;

内置主线程池的状态为正常状态。

3.根据权利要求1所述的一种高可用线程池切换方法,其特征在于,所述主线程池脏任务识别机制的识别步骤为:根据获取的主线程池,记录所述主线程池中每个任务的执行时长;

根据每个任务的执行时长,获取所述主线程池中的堆栈,分析所述堆栈里占比最多的前若干任务和所述堆栈里耗时最长的前若干任务;

对所述堆栈里占比最多的前若干任务和所述堆栈里耗时最长的前若干任务的集合取交集,并从所述交集中选取得到占比最多且耗时最多的第一个作为脏任务。

4.根据权利要求1所述的一种高可用线程池切换方法,其特征在于,每个所述主线程池配置有一个备用线程池,所述备用线程池在使用时新建,用完时进行回收。

5.根据权利要求1所述的一种高可用线程池切换方法,其特征在于,所述主线程池中分配最多的资源进行任务执行,所述脏任务资源受限线程池中分配最少的资源进行任务执行。

6.根据权利要求1所述的一种高可用线程池切换方法,其特征在于,所述的根据所述主线程池的状态,切换至不同的线程池执行新接收的任务,还包括:当所述主线程池的状态为正常状态时,返回原主线程池为新接收的任务提供服务;

当所述主线程池的状态为疑似阻塞状态时,返回原主线程池为新接收的任务提供服务;

当所述主线程池的状态为恢复中状态时,返回备用线程池为新接收的任务提供服务。

7.一种高可用线程池切换装置,其特征在于,该装置支持如权利要求1至6中任一所述的一种高可用线程池切换方法;该装置包括:获取主线程池单元,用于从动态线程池工厂获取主线程池;

检测状态单元,用于检测从动态线程池工厂获取的主线程池的状态;

线程池切换单元,用于根据所述主线程池的状态,切换至不同的线程池执行新接收的任务。

说明书 :

一种高可用线程池切换方法及装置

技术领域

[0001] 本发明涉及数据传输及线程池切换技术领域,具体涉及一种高可用线程池切换方法及装置。

背景技术

[0002] 现有的线程池切换方法主要包括两类:第一类方法普遍侧重于识别环境的变化,动态设置线程池的参数,调大以适应大任务量,调小以节约资源,现有的线程池相关专利如:“CN202110343860.5  线程池调节方法、装置、存储介质及电子设备”、“CN201810990940.8 一种线程池优化方法及系统”、“CN202110838179.8 一种用于线程池参数动态设置的方法、系统及设备”。
[0003] 第二类方法预置优先级方式,给任务设定优先级,优先响应高优先级的任务,现有的相关专利如:“CN201510162291.9  一种基于信号量的线程池共享方法及系统”、“CN201810935659.4 一种java线程池分级处理方法和装置”。
[0004] 然而,以上两类方法都解决不了目前系统中遇到以下场景存在的问题:某运行多任务的线程池在定时接收任务处理时由于某个任务耗时较长,久而久之导致线程池资源全部被该任务侵占,其余任务则无法得到及时响应。但由于所有这些任务无法预先设定优先级且本身并未区分优先级。因此,在遇到以上场景时,会出现某个任务耗时拖延,从而导致整体卡顿的问题。

发明内容

[0005] 本发明目的在于提供一种高可用线程池切换方法及装置,本发明能够解决当多个任务共用一个线程池时,其中某个任务耗时拖延,从而导致整体卡顿的问题。本发明使所有任务的平均响应时间达到了最低,且会自动识别有问题的任务,减少了人工干预;同时避免人工修改线程池参数;从而保证业务系统平稳运行,降低故障率,实现了高可用。
[0006] 本发明通过下述技术方案实现:
[0007] 第一方面,本发明提供了一种高可用线程池切换方法,该方法包括:
[0008] 从动态线程池工厂获取主线程池,并检测所述主线程池的状态;
[0009] 根据所述主线程池的状态,切换至不同的线程池执行新接收的任务,包括:
[0010] 当所述主线程池的状态为确定阻塞状态时,则从主线程池切换至备用线程池为新接收的任务提供服务(这时主线程池不再为新接收的任务提供服务,只负责为原接收的任务提供服务,而是由备用线程池为新接收的任务提供服务),同时启动主线程池脏任务识别机制进行脏任务识别,并将识别出的脏任务置于脏任务资源受限线程池中执行;
[0011] 当所述脏任务识别完成后,开启定时任务;根据所述定时任务检测所述主线程池的最新状态,如果所述主线程池的最新状态为恢复完成状态,则由备用线程池切换至原主线程池为新接收的任务提供服务。
[0012] 工作原理是:为了不过多占用资源,把同类任务放在一个线程池,本方案重点解决的是当多个任务共用一个线程池时,其中某个任务耗时拖延,从而导致整体卡顿的问题。本发明参考分布式系统中的高可用HA(High Availability)思想,给每个线程池也配置了一个备用线程池,根据主线程池的状态,切换至不同的线程池执行新接收的任务;当检测到主线程池开始有排队,且排队比达到预设值后,即主线程池的状态为确定阻塞状态时,则从主线程池切换至备用线程池为新接收的任务提供服务,同时启动主线程池脏任务识别机制进行脏任务识别,并将识别出的脏任务置于脏任务资源受限线程池中执行;当所述脏任务识别完成后,开启定时任务;根据所述定时任务检测所述主线程池的最新状态,如果所述主线程池的最新状态回归正常(不再排队),则由备用线程池切换至原主线程池为新接收的任务提供服务。
[0013] 本发明方法适用于保障数据稳定传输,尤其适应于两个系统之间涉及到大量数据传输的场景。比如,我们把该方法应用于性能管理系统和网络流量分析审计系统之间的数据稳定传输。
[0014] 进一步地,该方法还包括动态线程池工厂的初始化,具体为:
[0015] 设置动态线程池工厂,线程池获取必须经过统一调度入口;所述动态线程池工厂为多任务共用线程池;
[0016] 初始化备用线程池,初始化脏任务资源受限线程池;
[0017] 内置主线程池的状态为正常状态。
[0018] 进一步地,所述主线程池的状态包括正常状态、疑似阻塞状态、确定阻塞状态、恢复中状态和恢复完成状态。
[0019] 进一步地,所述主线程池的状态的判断依据为:
[0020] 如果所述主线程池中的阻塞块大小为0或者使用的阻塞块在阻塞队列总容量中的占比不超过第一预设值(比如40%)时,那么所述主线程池为正常状态;
[0021] 如果所述主线程池中的阻塞块大小不为0,且使用的阻塞块在阻塞队列总容量中的占比超过第一预设值(比如40%)时,所述主线程池陷入繁忙,将所述主线程池状态置为疑似阻塞状态;
[0022] 每次获取所述主线程池时,对所述主线程池的疑似阻塞状态进行记录,记录累计繁忙次数;当所述累计繁忙次数达到第二预设值时,将所述主线程池状态置为确定阻塞状态;
[0023] 根据确定阻塞状态后,启动主线程池脏任务识别机制进行脏任务识别,找出导致阻塞的任务名称并记录;当所述脏任务识别完成后,开启定时任务,那么所述主线程池处于恢复中,将所述主线程池状态置为恢复中状态;直至恢复完成,将所述主线程池状态置为恢复完成状态。
[0024] 进一步地,所述脏任务指的是在主线程池中占比最多且耗时最多的任务。
[0025] 进一步地,所述主线程池脏任务识别机制的识别步骤为:
[0026] 根据获取的主线程池,记录所述主线程池中每个任务的执行时长;
[0027] 根据每个任务的执行时长,获取所述主线程池中的堆栈,分析所述堆栈里面占比最多的前若干任务(比如占比最多的前五个任务Top5)和所述堆栈里面耗时最长的前若干任务(比如耗时最长的前五个任务Top5);
[0028] 对所述堆栈里面占比最多的前若干任务和所述堆栈里面耗时最长的前若干任务的集合取交集,并从所述交集中选取得到占比最多且耗时最多的第一个作为脏任务。
[0029] 进一步地,每个所述主线程池配置有一个备用线程池,所述备用线程池在使用时新建,用完时进行回收。
[0030] 进一步地,所述主线程池中分配最多的资源进行任务执行,所述脏任务资源受限线程池中分配最少的资源进行任务执行。
[0031] 以上技术方案,即当通过主线程池脏任务识别机制识别出主线程池中的一个脏任务后,将识别出的脏任务置于脏任务资源受限线程池中执行,而这时脏任务资源受限线程池中分配相对比较少的资源进行该脏任务的执行;同时已经从主线程池切换至备用线程池后的主线程池因不再接收新任务而只负责为原接收的任务提供服务,这时,主线程池中分配相对比较多的资源进行原接收的任务执行。
[0032] 进一步地,所述的根据所述主线程池的状态,切换至不同的线程池执行新接收的任务,还包括:
[0033] 当所述主线程池的状态为正常状态时,返回原主线程池为新接收的任务提供服务;
[0034] 当所述主线程池的状态为疑似阻塞状态时,返回原主线程池为新接收的任务提供服务;
[0035] 当所述主线程池的状态为恢复中状态时,返回备用线程池为新接收的任务提供服务。
[0036] 第二方面,本发明又提供了一种高可用线程池切换装置,该装置支持所述的一种高可用线程池切换方法;该装置包括:
[0037] 获取主线程池单元,用于从动态线程池工厂获取主线程池;
[0038] 检测状态单元,用于检测从动态线程池工厂获取的主线程池的状态;
[0039] 线程池切换单元,用于根据所述主线程池的状态,切换至不同的线程池执行新接收的任务。
[0040] 本发明与现有技术相比,具有如下的优点和有益效果:
[0041] 本发明一种高可用线程池切换方法及装置,参考分布式系统中的高可用HA思想,给每个线程池也配置了一个备用线程池,根据主线程池的状态,切换至不同的线程池执行新接收的任务;当检测到主线程池开始有排队,且排队比达到预设值后,即主线程池的状态为确定阻塞状态时,则从主线程池切换至备用线程池为新接收的任务提供服务,同时启动主线程池脏任务识别机制进行脏任务识别,并将识别出的脏任务置于脏任务资源受限线程池中执行;当所述脏任务识别完成后,开启定时任务;根据所述定时任务检测所述主线程池的最新状态,如果所述主线程池的最新状态回归正常(即不再排队),则由备用线程池切换至原主线程池为新接收的任务提供服务。本发明能够解决当多个任务共用一个线程池时,其中某个任务耗时拖延,从而导致整体卡顿的问题。本发明使所有任务的平均响应时间达到了最低,且会自动识别有问题的任务,减少了人工干预;同时避免人工修改线程池参数;从而保证业务系统平稳运行,实现了高可用,降低故障率。

附图说明

[0042] 此处所说明的附图用来提供对本发明实施例的进一步理解,构成本申请的一部分,并不构成对本发明实施例的限定。在附图中:
[0043] 图1为本发明一种高可用线程池切换方法流程图。
[0044] 图2为本发明一种高可用线程池切换装置结构示意图。

具体实施方式

[0045] 为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明作进一步的详细说明,本发明的示意性实施方式及其说明仅用于解释本发明,并不作为对本发明的限定。
[0046] 实施例1
[0047] 为了不过多占用资源,把同类任务放在一个线程池,本方案重点解决的是当多个任务共用一个线程池时,其中某个任务耗时拖延,从而导致整体卡顿的问题。本发明参考分布式系统中的高可用HA(High Availability)思想,给每个线程池也配置了一个备用线程池,根据主线程池的状态,切换至不同的线程池执行新接收的任务;当检测到主线程池开始有排队,且排队比达到预设值后,即主线程池的状态为确定阻塞状态时,则从主线程池切换至备用线程池为新接收的任务提供服务,同时启动主线程池脏任务识别机制进行脏任务识别,并将识别出的脏任务置于脏任务资源受限线程池中执行;当所述脏任务识别完成后,开启定时任务;根据所述定时任务检测所述主线程池的最新状态,如果所述主线程池的最新状态回归正常(即不再排队),则由备用线程池切换至原主线程池为新接收的任务提供服务。
[0048] 如图1所示,本发明一种高可用线程池切换方法,该方法包括:
[0049] 动态线程池工厂的初始化;
[0050] 从动态线程池工厂获取主线程池,并检测所述主线程池的状态;
[0051] 根据所述主线程池的状态,切换至不同的线程池执行新接收的任务,包括:
[0052] 当所述主线程池的状态为确定阻塞状态时,则从主线程池切换至备用线程池为新接收的任务提供服务(这时主线程池不再为新接收的任务提供服务,只负责为原接收的任务提供服务,而是由备用线程池为新接收的任务提供服务),同时启动主线程池脏任务识别机制进行脏任务识别,并将识别出的脏任务置于脏任务资源受限线程池中执行;
[0053] 当所述脏任务识别完成后,开启定时任务;根据所述定时任务检测所述主线程池的最新状态,如果所述主线程池的最新状态为恢复完成状态,则由备用线程池切换至原主线程池为新接收的任务提供服务;
[0054] 当所述主线程池的状态为正常状态时,返回原主线程池为新接收的任务提供服务;
[0055] 当所述主线程池的状态为疑似阻塞状态时,返回原主线程池为新接收的任务提供服务;
[0056] 当所述主线程池的状态为恢复中状态时,返回备用线程池为新接收的任务提供服务。
[0057] 其中,每个所述主线程池配置有一个备用线程池,所述备用线程池在使用时新建,用完时进行回收。
[0058] 作为进一步地实施,所述动态线程池工厂的初始化,包括:
[0059] S11:设置动态线程池工厂,线程池获取必须经过统一调度入口;所述动态线程池工厂为多任务共用线程池;
[0060] S12:获取线程池时,同时传入当前任务名称λ;
[0061] S13:初始化备用线程池;
[0062] S14:初始化脏任务资源受限线程池;
[0063] S15:内置主线程池的状态为正常状态。
[0064] 其中,S31“动态线程池工厂”是一个设计模式里的概念,即原本程序是可以直接拿到线程池A的,但是现在被"工厂"封装了起来,统一提供A。
[0065] 作为进一步地实施,所述主线程池的状态包括正常状态、疑似阻塞状态、确定阻塞状态、恢复中状态和恢复完成状态。具体地,所述主线程池的状态的判断依据为:
[0066] 如果所述主线程池中的阻塞块大小为0或者使用的阻塞块在阻塞队列总容量中的占比不超过第一预设值(比如40%)时,那么所述主线程池为正常状态;
[0067] 如果所述主线程池中的阻塞块大小不为0,且使用的阻塞块在阻塞队列总容量中的占比超过第一预设值(比如40%)时,所述主线程池陷入繁忙,将所述主线程池状态置为疑似阻塞状态;
[0068] 每次获取所述主线程池时,对所述主线程池的疑似阻塞状态进行记录,记录累计繁忙次数;当所述累计繁忙次数达到第二预设值时,将所述主线程池状态置为确定阻塞状态;
[0069] 根据确定阻塞状态后,启动主线程池脏任务识别机制进行脏任务识别,找出导致阻塞的任务名称并记录到C中;当所述脏任务识别完成后,开启定时任务,那么所述主线程池处于恢复中,将所述主线程池状态置为恢复中状态;直至恢复完成,将所述主线程池状态置为恢复完成状态。
[0070] 作为进一步地实施,所述脏任务指的是在主线程池中占比最多且耗时最多的任务。具体地,所述主线程池脏任务识别机制的识别步骤为:
[0071] 根据获取的主线程池,记录所述主线程池中每个任务的执行时长;
[0072] 根据每个任务的执行时长,获取所述主线程池中的堆栈,分析所述堆栈里面占比最多的前若干任务(比如占比最多的前五个任务Top5)和所述堆栈里面耗时最长的前若干任务(比如耗时最长的前五个任务Top5);
[0073] 对所述堆栈里面占比最多的前若干任务和所述堆栈里面耗时最长的前若干任务的集合取交集,并从所述交集中选取得到占比最多且耗时最多的第一个作为脏任务。
[0074] 以上主线程池脏任务识别机制还可以采用除以上任务占比高、任务耗时高等其他方式。
[0075] 作为进一步地实施,所述主线程池中分配最多的资源进行任务执行,所述脏任务资源受限线程池中分配最少的资源进行任务执行。
[0076] 以上技术方案,即当通过主线程池脏任务识别机制识别出主线程池中的一个脏任务后,将识别出的脏任务置于脏任务资源受限线程池中执行,而这时脏任务资源受限线程池中分配相对比较少的资源进行该脏任务的执行;同时已经从主线程池切换至备用线程池后的主线程池因不再接收新任务而只负责为原接收的任务提供服务,这时,主线程池中分配相对比较多的资源进行原接收的任务执行。
[0077] 比如,当通过主线程池脏任务识别机制识别出主线程池中的一个脏任务后,将识别出的脏任务置于脏任务资源受限线程池中执行,而这时脏任务资源受限线程池中分配2个资源进行该脏任务的执行;而这时的主线程池中分配50个资源进行原接收的任务执行(而初始主线程池中分配20个资源进行任务的执行)。
[0078] 本发明根据以上步骤,可以达到任务的容灾,即使有个任务无限阻塞,其余任务也能正常获取到资源执行,保证整体收益最大化。
[0079] 本发明的应用场景:适应于两个系统之间涉及到大量数据传输的场景。比如,性能管理系统和网络流量分析审计系统之间的数据稳定传输。根据业务的不同,传输定义了很多的命令格式,而这些命令是共用的线程池进行处理的。这就很容易出现,一损俱损的情况,即某个任务代码逻辑有问题,或者别的原因阻塞,导致别的功能没法正常使用。这不是简单的通过扩容可以解决的,必须能动态识别脏任务,并做事后资源隔离。
[0080] 因此,本发明基于以上场景的问题,设计了一种高可用线程池切换方法。本发明能够解决当多个任务共用一个线程池时,其中某个任务耗时拖延,从而导致整体卡顿的问题。本发明使所有任务的平均响应时间达到了最低,且会自动识别有问题的任务,减少了人工干预;同时避免人工修改线程池参数;从而保证业务系统平稳运行,实现了高可用,降低故障率。本发明方法适用于保障数据稳定传输,尤其,我们把该方法应用于性能管理系统和网络流量分析审计系统之间的数据稳定传输。
[0081] 实施例2
[0082] 如图2所示,本实施例与实施例1的区别在于,本实施例提供了一种高可用线程池切换装置,该装置支持实施例1所述的一种高可用线程池切换方法;该装置包括:
[0083] 获取主线程池单元,用于从动态线程池工厂获取主线程池;
[0084] 检测状态单元,用于检测从动态线程池工厂获取的主线程池的状态;所述主线程池的状态包括正常状态、疑似阻塞状态、确定阻塞状态、恢复中状态和恢复完成状态;
[0085] 线程池切换单元,用于根据所述主线程池的状态,切换至不同的线程池执行新接收的任务,包括:
[0086] 当所述主线程池的状态为确定阻塞状态时,则从主线程池切换至备用线程池为新接收的任务提供服务(这时主线程池不再为新接收的任务提供服务,只负责为原接收的任务提供服务,而是由备用线程池为新接收的任务提供服务),同时启动主线程池脏任务识别机制进行脏任务识别,并将识别出的脏任务置于脏任务资源受限线程池中执行;
[0087] 当所述脏任务识别完成后,开启定时任务;根据所述定时任务检测所述主线程池的最新状态,如果所述主线程池的最新状态为恢复完成状态,则由备用线程池切换至原主线程池为新接收的任务提供服务。
[0088] 其中,各个单元的执行过程按照实施例1所述的一种高可用线程池切换方法流程步骤执行即可,此实施例中不再一一赘述。
[0089] 本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。
[0090] 本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0091] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0092] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0093] 以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。