具体实施方式
下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的模块或具有相同或类似功能的模块。下面通过参考附图描述的实施例是示例性的,仅用于解释本申请,而不能理解为对本申请的限制。相反,本申请的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。
图1是本申请一实施例提出的任务处理方法的流程示意图,该方法包括:
S11:获取任务的优先级。
具体的,可以获取任务的重试次数,以根据重试次数确定优先级。
其中,重试次数越少,优先级越高,重试次数越多,优先级越低。
可以对应每个任务记录重试次数,当一个任务被执行一次后,将重试次数加1,重试次数的初始值为0。
当任务是第一次执行时,该任务的重试次数是0,当任务是第二次执行时,该任务的重试次数是1,依此类推。
具体的,任务的相关信息可以记录在任务表中,与一般的任务处理流程不同的是,本实施例中,该任务表中可以对应每个任务记录重试次数,以便从任务表中获取任务的重试次数。或者,也可以在任务表中记录任务的当前执行次数,根据当前执行次数推断出重试次数,例如,当前执行次数是第一次,则重试次数是0,当前执行次数是第二次,则重试次数是1。
S12:根据所述优先级为所述任务分配执行参数,所述执行参数包括:重试执行时间,和/或,执行资源。
一些实施例中,在所述任务的当前处理失败时,为所述任务分配重试执行时间,所述重试执行时间的计算公式为:
重试执行时间=当前处理时间+重试间隔;
其中,所述重试间隔是根据预先建立的重试次数与重试间隔之间的对应关系确定的,在所述对应关系中,重试次数越多,对应的重试间隔越大。
例如,重试次数与重试间隔之间的对应关系可以如表1所示:
表1
第N次重试 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
重试间隔 |
2m |
10m |
10m |
1h |
2h |
6h |
15h |
例如:
任务第一次执行失败,将在2分钟后再次重试,重试时间(next_exec_time)=当前时间+2min;
任务第6次执行失败,将在6小时后再次重试,next_exec_time=当前时间+6hours。
这样就可以实现重试次数越少(优先级越高)的任务的执行频率越高,优先级越低的任务的执行频率越低。
一些实施例中,根据预先建立的重试次数与执行资源之间的对应关系,为所述任务分配与所述重试次数对应的执行资源;其中,在所述对应关系中,重试次数越多,执行资源越少。
例如,执行资源用线程池队列表示,线程池队列可以分为预设个数,例如,分为8个线程池队列。
不同的线程池队列具有不同的权重值。例如,如表2所示。
表2
在为任务分配资源时,可以根据任务的重试次数,将重试次数越少的任务分配给权重值越大的线程池队列执行。
例如,在表2中,Q0~Q3队列的权重值最大,Q4~Q5队列的权重值次之,Q6~Q7队列的权重值最小,则第一次执行的任务(重试次数为0)分配给Q0~Q3队列执行,第二~五次执行的任务(重试次数为1~4)分配给Q4~Q5队列执行,第六~八次执行的任务(重试次数为5~7)分配给Q6~Q7队列执行。其中,对于权重值相同的队列,任务可以随机分配,例如,第一次执行的任务可以随机分配给Q0~Q3中的任意一个队列执行。
按照表2所示的权重值,对于第一次执行的任务,将会有93.02%的机会分配资源执行;对于失败过1,2,3,4次的任务,将有4.65%的机会分配资源执行,对于失败了5,6,7次的任务,将有2.33%的机会分配资源执行。
这样就可以实现重试次数少(优先级高)的任务分配更多的资源执行,优先级低的任务分配少一些的资源执行。
S13:根据所述执行参数,对所述任务进行处理。
一些实施例中,当执行参数包括重试执行时间时,在需要对所述任务进行重试处理时,确定所述重试处理时的当前时间,并获取为所述任务分配的重试执行时间;如果所述当前时间大于或等于所述重试执行时间,获取所述任务,并对获取的任务进行处理。
例如,对应一个任务,上次失败的时间是0点,根据重试次数(重试次数例如为4)确定的重试间隔是1小时,则如果当前时间小于1(0+1)点,则不获取该任务,只在当前时间大于1点,才会获取并处理该任务。
一些实施例中,当执行参数包括执行资源时,采用所述执行资源对所述任务进行处理。
例如,重试次数为4时,根据表2,则将任务随机分配给Q4和Q5队列中的一个执行。
本实施例中,通过获取任务的优先级,并根据优先级分配执行参数,可以实现不同优先级的任务分配不同级别的资源,提高资源利用的合理性,从而提高任务处理吞吐量,保证任务处理的时效性。
图2是本申请另一实施例提出的任务处理方法的流程示意图。
为了更好的理解本申请,先对通常的任务处理流程进行简单说明。
通常的任务处理系统的结构如图3所示。如图3所示,通常的任务处理系统的处理流程如下:
任务来源系统到任务处理系统注册任务(1、2);
恢复定时器定时触发任务处理系统处理任务(A);
任务处理系统被定时触发后,从任务池获取任务(B);
任务处理系统获取任务后,执行任务(C),之后,可以将执行后的任务发送给任务依赖系统。
从上述的任务处理流程来看,有以下几个缺点:
每个任务执行过了多少次,无从知晓,无法将执行过多次的任务与一次没有执行过或是执行次数少的任务进行区分;
对于一些多次执行都无法成功的任务,每次定时器运行时它们均会被捞取并执行,而结果极有可能是继续失败,造成系统资源的浪费;
对于一次没有执行过的任务,无法做到优先执行。
上面对通常的任务处理流程及存在的问题进行了描述,为了解决上述通常的任务处理流程存在的问题,可以采用本实施例提出的方法,本实施例提出的方法的具体内容可以参见后续描述。
本实施例中,将以任务是海量流水型任务为例。
海量流水型任务的业务场景例如是支付宝商户通知系统,商户通知就是该系统需要处理的任务。每日该系统需要通知商户的消息量上亿级,商户对消息通知的时效性要求较高。如果没有合理分配好系统资源,一方面消息的时效性将受到极大影响,对用户造成不好的体验;另一方面,如果商户端出现异常,商户通知任务短时间内出现大量通知失败,通知系统的吞吐量极大降低,系统处理压力持续增大。
通常流水型任务处理系统的职能在设计上都是单一化,对于支付宝商户通知系统,其流水型任务就是商户通知,相关技术中,数据库中的表设计如表3所示:
表3中的字段只需要记录需要通知的内容即可。
一个设计合理的海量级任务处理系统应该有如下特点:
1.任务处理区分优先级,高优先级的优先处理。
2.系统资源的合理分配,最大程度提高系统处理的吞吐量;
3.任务处理有时效性,任务的积压时间小,系统中任务的积压量少;
以下思路可以一定程度上达到这个目的:
任务分优化级,按优先级进行系统资源分配,达到高优先级的任务可以有更多的资源,以及更高的频率处理;低优先级的任务占用更少的资源以及更低频率的处理;
在流水型任务没有天然优先级业务特性的情况下,我们可以作这样的假设:任务如果一次都没有执行过,成功执行的机率相对较高;如果己经执行失败过几次,再执行失败的可能性更大,也就是说,在保障任务成功率的前提下,失败次数少的任务优先级高,失败次数多的任务优先级低。可以得出以下结论:
对于一次没执行或是执行失败次数少的任务,系统可以分配更多的资源以及较高的频率来执行,以减少任务的积压,提高系统吞吐量;
在任务执行失败达到一定次数后,系统可以降低执行频率并分配更少的资源给这些任务,以达到合理分配系统资源的目的。
为了达到上面合理目的,可以为任务表加上如下两个字段
group_no:表示消息执行了几次;执行的次数越多,说明失败次数越多。
next_exec_time:如果任务执行失败过,这个字段记录下次任务执行时间;
以国际支付商户通知的Notify表为例,表结构如表4所示:
表4
基于表4所示的任务表,本实施例的方法流程可以包括:
S21:从任务表中,获取任务的当前执行次数,并根据当前执行次数确定重试次数。
其中,以任务是国际支付商户通知(简称为通知)为例。
如表4所示,任务表中包含group_no参数,该参数用于记录通知的当前执行次数,从而可以读取该参数,获取通知的当前执行次数。
在获取当前执行次数后,可以用当前执行次数减1得到重试次数。
例如,当前执行次数是第一次执行,则重试次数是0,当前执行次数是第二次执行,则重试次数是1。
S22:从任务表中,获取该任务对应的重试执行时间,如果当前时间大于或等于重试执行时间,从任务池中获取该任务,如果当前时间小于重试执行时间,不获取该任务。
其中,当定时器触发任务处理系统执行任务时,任务处理系统可以先从任务池中获取任务。
本实施例中,任务处理系统在从任务池中获取任务时,可以比较获取任务时的当前时间与任务表中记录的该任务对应的重试执行时间(next_exec_time),以根据比较结果确定获取或不获取对应的任务。
每个任务的重试执行时间的初始值可以是定时器对应的第一次执行时间,以后的重试执行时间可以根据如后续所示的流程进行更新。
S23:在获取任务后,根据预先建立的重试次数与执行资源之间的对应关系,将任务分配给对应的执行资源进行处理。
其中,执行资源可以具体是线程池的队列,可以预先建立如表2所示的重试次数与队列之间的对应关系。
在获取重试次数后,可以根据表2所示的对应关系,确定相应的队列,如重试次数是0时,将通知随机分配给Q0~Q3中的任一个队列进行处理。
S24:在任务处理之后,更新任务的当前执行次数。
例如,初始的当前执行次数是1,当对通知处理一次后,将表4中的group_no更新为2。
S25:在任务处理失败时,根据预先建立的重试次数与重试间隔之间的对应关系,确定对应的重试间隔,并根据当前执行时间和重试间隔确定重试执行时间,并在任务表中更新重试执行时间。
例如,可以预先建立表1所示的重试次数与重试间隔之间的对应关系。
如果当前执行次数更新为2后,则重试次数为1,另外,根据表1,对应的重试间隔是2分钟,则重试执行时间=当前执行时间+2分钟。
在得到重试执行时间后,将该重试执行时间更新记录在表4包含的next_exec_time参数中。
之后,在下次定时触发任务处理时,任务处理系统可以重复执行上述的S21-S25。
本实施例中,通过获取流水型任务的重试次数,可以依据该重试次数确定流水型任务的优先级,使得原本不存在优先级的流水型任务具有了优先级。进一步的,在任务处理时,高优先级(重试次数少)的任务能够被分配更多的资源,从而可以提高重试次数少的任务的执行概率,在当前任务处理失败时,根据重试次数分配重试间隔,可以提高重试次数少的任务执行频率,从而实现资源的合理分配,提高任务处理的吞吐量,减少任务积压,保证任务处理的时效性。
图4是本申请另一实施例提出的任务处理装置的结构示意图,该装置40包括:获取模块41、分配模块42和处理模块43。
获取模块41,用于获取任务的优先级;
可选的,所述任务是流水型任务。
可选的,获取模块41具体用于:
获取任务的重试次数,以根据重试次数确定优先级,其中,重试次数越少,优先级越高。
进一步的,获取模块41具体用于:
从任务表中获取重试次数;或者,
从任务表中获取当前执行次数,并根据当前执行次数确定重试次数。
可以对应每个任务记录重试次数,当一个任务被执行一次后,将重试次数加1,重试次数的初始值为0。
当任务是第一次执行时,该任务的重试次数是0,当任务是第二次执行时,该任务的重试次数是1,依此类推。
具体的,任务的相关信息可以记录在任务表中,与一般的任务处理流程不同的是,本实施例中,该任务表中可以对应每个任务记录重试次数,以便从任务表中获取任务的重试次数。或者,也可以在任务表中记录任务的当前执行次数,根据当前执行次数推断出重试次数,例如,当前执行次数是第一次,则重试次数是0,当前执行次数是第二次,则重试次数是1。
分配模块42,用于根据所述优先级为所述任务分配执行参数,所述执行参数包括:重试执行时间,和/或,执行资源;
可选的,分配模块42具体用于:
在所述任务的当前处理失败时,为所述任务分配重试执行时间,所述重试执行时间的计算公式为:
重试执行时间=当前处理时间+重试间隔;
其中,所述重试间隔是根据预先建立的重试次数与重试间隔之间的对应关系确定的,在所述对应关系中,重试次数越多,对应的重试间隔越大。
例如,重试次数与重试间隔之间的对应关系可以如表1所示。
这样就可以实现重试次数少(优先级高)的任务的执行频率高,优先级低的任务的执行频率低。
可选的,分配模块42具体用于:
根据预先建立的重试次数与执行资源之间的对应关系,为所述任务分配与所述重试次数对应的执行资源;
其中,在所述对应关系中,重试次数越多,执行资源越少。
例如,执行资源用线程池队列表示,线程池队列可以分为预设个数,例如,分为8个线程池队列。
不同的线程池队列具有不同的权重值。例如,如表2所示。
在为任务分配资源时,可以根据任务的重试次数,将重试次数越小的任务分配给权重值越大的线程池队列执行。
例如,在表2中,Q0~Q3队列的权重值最大,Q4~Q5队列的权重值次之,Q6~Q7队列的权重值最小,则第一次执行的任务(重试次数为0)分配给Q0~Q3队列执行,第二~五次执行的任务(重试次数为1~4)分配给Q4~Q5队列执行,第六~八次执行的任务(重试次数为5~7)分配给Q6~Q7队列执行。其中,对于权重值相同的队列,任务可以随机分配,例如,第一次执行的任务可以随机分配给Q0~Q3中的任一个队列执行。
按照表2所示的权重值,对于第一次执行的任务,将会有93.02%的机会分配资源执行;对于失败过1,2,3,4次的任务,将有4.65%的机会分配资源执行,对于失败了5,6,7次的任务,将有2.33%的机会分配资源执行。
这样就可以实现重试次数少(优先级高)的任务分配更多的资源执行,而低优先级的任务分配少一些的资源执行。
处理模块43,用于根据所述执行参数,对所述任务进行处理。
可选的,处理模块43具体用于:
在需要对所述任务进行重试处理时,确定所述重试处理时的当前时间,并获取为所述任务分配的重试执行时间;如果所述当前时间大于或等于所述重试执行时间,获取所述任务,并对获取的任务进行处理。
例如,对应一个任务,上次失败的时间是0点,根据重试次数(重试次数例如为4)确定的重试间隔是1小时,则如果当前时间小于1(0+1)点,则不获取该任务,只在当前时间大于1点时,才会获取并处理该任务。
可选的,当所述执行资源是线程池的队列时,处理模块43具体用于:
在获取到所述任务后,采用为所述任务分配的执行资源对所述任务进行处理,其中,当任务的优先级越高,分配的队列的权重值越高。
例如,重试次数为4时,根据表2,则将任务随机分配给Q4和Q5队列中的一个执行。
一些实施例中,参见图5,该装置还包括:
记录模块44,用于在为所述任务分配重试执行时间后,将所述重试执行时间更新记录在任务表中。
上述模块的具体功能可以参见方法实施例中的相关描述,在此不再赘述。
本实施例中,通过获取流水型任务的重试次数,可以依据该重试次数确定流水型任务的优先级,使得原本不存在优先级的流水型任务具有了优先级。进一步的,在任务处理时,高优先级(重试次数少)的任务能够被分配更多的资源,从而可以提高重试次数少的任务的执行概率,在当前任务处理失败时,根据重试次数分配重试间隔,可以提高重试次数少的任务执行频率,从而实现资源的合理分配,提高任务处理的吞吐量,减少任务积压,保证任务处理的时效性。
图6是本申请另一实施例提出的电子设备的结构示意图。该电子设备用于对任务进行处理,例如是服务器。参见图6,该电子设备60包括:壳体61、处理器62、存储器63、电路板64和电源电路65,其中,电路板65安置在壳体61围成的空间内部,处理器62和存储器63设置在电路板64上;电源电路65,用于为电子设备的各个电路或器件供电;存储器63用于存储可执行程序代码;处理器62通过读取存储器63中存储的可执行程序代码来运行与可执行程序代码对应的程序,以用于执行以下步骤:
获取任务的优先级;
根据所述优先级为所述任务分配执行参数,所述执行参数包括:重试执行时间,和/或,执行资源;
根据所述执行参数,对所述任务进行处理。
可选的,所述获取任务的优先级,包括:
获取任务的重试次数,以根据重试次数确定优先级,其中,重试次数越少,优先级越高。
可选的,所述根据所述优先级为所述任务分配执行参数,包括:
在所述任务的当前处理失败时,为所述任务分配重试执行时间,所述重试执行时间的计算公式为:
重试执行时间=当前处理时间+重试间隔;
其中,所述重试间隔是根据预先建立的重试次数与重试间隔之间的对应关系确定的,在所述对应关系中,重试次数越多,对应的重试间隔越大。
可选的,所述根据所述优先级为所述任务分配执行参数,包括:
根据预先建立的重试次数与执行资源之间的对应关系,为所述任务分配与所述重试次数对应的执行资源;
其中,在所述对应关系中,重试次数越多,执行资源越少。
可选的,当所述执行资源是线程池的队列时,所述根据所述执行参数,对所述任务进行处理,包括:
在获取到所述任务后,采用为所述任务分配的执行资源对所述任务进行处理,其中,当任务的优先级越高,可分配的队列权重越多。
可选的,所述根据所述执行参数,对所述任务进行处理,包括:
在需要对所述任务进行重试处理时,确定所述重试处理时的当前时间,并获取为所述任务分配的重试执行时间;
如果所述当前时间大于或等于所述重试执行时间,获取所述任务,并对获取的任务进行处理。
可选的,所述获取任务的重试次数,包括:
从任务表中获取重试次数;或者,
从任务表中获取当前执行次数,并根据当前执行次数确定重试次数。
可选的,还包括:
在为所述任务分配重试执行时间后,将所述重试执行时间更新记录在任务表中。
可选的,所述任务是流水型任务。
可以理解的是,本实施例的内容与方法实施例对应,具体内容可以参见方法实施例中的相关描述,在此不再赘述。
本实施例中,通过获取流水型任务的重试次数,可以依据该重试次数确定流水型任务的优先级,使得原本不存在优先级的流水型任务具有了优先级。进一步的,在任务处理时,高优先级(重试次数少)的任务能够被分配更多的资源,从而可以提高重试次数少的任务的执行概率,在当前任务处理失败时,根据重试次数分配重试间隔,可以提高重试次数少的任务执行频率,从而实现资源的合理分配,提高任务处理的吞吐量,减少任务积压,保证任务处理的时效性。
需要说明的是,在本申请的描述中,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。此外,在本申请的描述中,除非另有说明,“多个”的含义是指至少两个。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。
应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本申请各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。