一种异步调用方法及系统与流程

文档序号:19154992发布日期:2019-11-16 00:37阅读:148来源:国知局
一种异步调用方法及系统与流程

【技术领域】

本发明涉及分布式系统技术领域,具体涉及一种异步调用方法及系统。



背景技术:

在现有技术中,分布式系统对于远程的同步调用,上下游系统之间是强依赖关系。服务端如果因为网络抖动等原因无法提供正常服务,本次请求就会失败,客户端需要在代码中定义重试策略。因此,上下游系统的耦合性强,在下游系统出现变更时,上游可能需要修改代码。而如果同步的调用请求执行时间较长,会导致客户端一直阻塞等待本次调用结果,对客户端性能产生影响,如果本次调用失败,客户端需要单独增加失败处理逻辑,根据情况进行重试,缺少灵活的调用策略,比如感知到服务端从故障中恢复后,可以立即对其进行调用。



技术实现要素:

为解决前述问题,本发明提供了一种异步调用方法,解决现有技术中心同步调用带来的高耦合性、执行阻塞的问题,同时提供了灵活的重试策略和调度策略。

为了达到上述目的,本发明采用如下技术方案:

一种异步调用方法,包括如下步骤:

步骤s100:接收任务请求,并将任务的任务信息存入数据库,所述任务信息包括任务的执行时间、任务的下次执行时间以及任务提交人的id;

步骤s110:判断当前第一线程池资源是否足够,若是,则创建新的任务处理线程并提交给第一线程池,执行步骤s120,若否,则执行步骤s130;

步骤s120:第一线程池启动其中任务的任务处理线程,对服务端发起调用;

步骤s130:判断缓存队列是否已满,若否,将任务放入缓存队列,执行步骤s140,若是,则将任务放入数据库,执行步骤s160;

步骤s140:第一定时器定时扫描缓存队列,根据任务的执行时间取出缓存队列中需要执行的任务,放入第二线程池;

步骤s150:第二线程池启动其中任务的任务处理线程,对服务端进行调用;

步骤s160:第二定时器定时扫描处理器,根据任务的执行时间取出数据库中需要执行的任务,放入第三线程池;

步骤s170:第三线程池启动其中任务的任务处理线程,对服务端进行调用。

进一步地,所述缓存队列包括至少一个待执行队列和至少一个暂存队列,所述待执行队列存放当前需要被执行的任务,所述暂存队列存放当前调用失败或未到执行时间的任务,所述步骤s120、步骤s150或步骤s170中,当任务调用失败时,将任务放入所述暂存队列,若所述暂存队列已满,则放入数据库。

更进一步地,所述步骤s140包括如下子步骤:

子步骤s141:第一定时器扫描待执行队列;

子步骤s142:读取本次扫描的第一扫描时间以及所述待执行队列中任务的第一执行时间,判断第一执行时间与第一扫描时间的先后顺序,若第一执行时间在第一扫描时间之前,则将该任务放入第二线程池,若第一执行时间在第一扫描时间之后,则将该任务放入所述暂存队列,

子步骤s143:重复子步骤s141和子步骤s142,直至待执行队列为空;

子步骤s144:所述待执行队列和所述暂存队列相互对调;

子步骤s145:第一定时器扫描对调后的待执行队列;

子步骤s146:读取本次扫描的第二扫描时间以及对调后的待执行队列中任务的第二执行时间或调用失败的任务的下次执行时间,判断第二执行时间或下次执行时间与第二扫描时间的先后顺序,若第二执行时间或下次执行时间在第二扫描时间之前,则将该任务放入第二线程池,若第二执行时间或下次执行时间在第二扫描时间之后,则将该任务放入对调后的暂存队列;

子步骤s147:重复子步骤s145和子步骤s146,直至对调后的待执行队列为空;

子步骤s148:再次将对调后的待执行队列和暂存队列相互对调,重复步骤s141至s147,直至缓存队列为空。

作为优选,所述步骤s160中,若任务的执行时间在本次扫描时间之前,且任务的执行时间与本次扫描时间的时间差小于预定时间,则将该任务放入待执行队列。

作为优选,所述第一线程池、第二线程池以及第三线程池启动任务处理线程对服务端进行调用后,若调用成功,则将结果记录到数据库中。

本发明所提供的方法具有如下有益效果:

将现有技术中同步调用的客户端和服务端完成解耦,因此,服务端的变更减少了对客户端的影响。并且,将同步调用转为异步调用,不再阻塞等待结果,提高了处理的性能,客户端无需根据失败情况,自己去实现失败重试策略的代码,提供了灵活的、可定制的失败重试策略。

此外,本发明还提供了一种异步调用系统,所述系统包括:

一种异步调用系统,其特征在于,所述系统包括:

配置模块,用于配置客户端应用名、服务端应用名、任务名称、任务的执行时间以及任务执行失败后任务的重试次数和重试间隔时间;

接收模块,用于接收客户端发来的任务,并将任务的任务信息存入数据库中,所述任务信息包括任务的执行时间、任务的下次执行时间以及任务提交人的id;

第一线程池,用于启动其中任务的任务处理线程;

缓存队列,用于在第一线程池资源不足或任务执行失败时存放任务并等待执行;

数据库,用于在缓存队列已满时存放任务并等待执行;

第一定时器,用于定时扫描缓存队列;

第二定时器,用于定时扫描数据库;

第二线程池,用于启动其中任务的任务处理线程;

第三线程池,用于启动其中任务的任务处理线程;

调用模块,根据第一线程池、第二线程池和第三线程池中的任务对服务端发起调用;

调度模块,用于判断第一线程池资源是否充足以及缓存队列是否已满,若第一线程池资源不足,调度模块将任务放入缓存队列,所缓存队列已满,调度模块将任务放入数据库。

进一步地,所述缓存队列包括至少一个待执行队列和至少一个暂存队列,所述待执行队列存放当前需要被执行的任务,所述暂存队列存放当前调用失败或未到执行时间的任务,当任务调用失败时,调度模块将任务放入所述暂存队列,若所述暂存队列已满,调度模块将任务放入数据库。

更进一步地,所述调度模块还用于:读取第一定时器扫描待执行队列的第一扫描时间以及所述待执行队列中任务的执行时间,判断任务的执行时间与第一扫描时间的先后顺序,若任务的执行时间在第一扫描时间之前,则将任务放入第二线程池,若任务的执行时间在第一扫描时间之后,则将该任务放入所述暂存队列,直至待执行队列为空,将所述待执行队列和所述暂存队列相互对调,第一定时器扫描对调后的待执行队列,读取本次扫描的第二扫描时间以及对调后的待执行队列中任务的第二执行时间或调用失败的任务的下次执行时间,判断第二执行时间或下次执行时间与第二扫描时间的先后顺序,若第二执行时间或下次执行时间在第二扫描时间之前,则将该任务放入第二线程池,若第二执行时间或下次执行时间在第二扫描时间之后,则将该任务放入对调后的暂存队列,直至对调后的待执行队列为空,重复前述操作,直至缓存队列为空。

作为优选,所述配置模块配置预定时间,所述调度模块读取第二定时器的扫描时间和任务的执行时间,若任务的执行时间在本次扫描时间之前,且任务的执行时间与本次扫描时间的时间差小于预定时间,则将该任务放入待执行队列。

作为优选,所述数据库记录调用模块调用任务成功的结果。

本发明所提供的异步调用系统与前述异步调用方法的有益效果推理过程相似,在此不再赘述。

本发明的这些特点和优点将会在下面的具体实施方式以及附图中进行详细的揭露。本发明最佳的实施方式或手段将结合附图来详尽表现,但并非是对本发明技术方案的限制。另外,在每个下文和附图中出现的这些特征、要素和组件是具有多个,并且为了表示方便而标记了不同的符号或数字,但均表示相同或相似构造或功能的部件。

【附图说明】

下面结合附图对本发明作进一步说明:

图1为本发明实施例一的流程图;

图2至5为本发明实施例一中缓存队列的时序图。

【具体实施方式】

下面结合本发明实施例的附图对本发明实施例的技术方案进行解释和说明,但下述实施例仅为本发明的优选实施例,并非全部。基于实施方式中的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得其他实施例,都属于本发明的保护范围。

在本说明书中引用的“一个实施例”或“实例”或“例子”意指结合实施例本身描述的特定特征、结构或特性可被包括在本专利公开的至少一个实施例中。短语“在一个实施例中”在说明书中的各位置的出现不必都是指同一个实施例。

实施例一:

如图1所示,本实施例提供一种异步调用方法,包括如下步骤:

步骤s100:接收任务请求,并将该任务的任务信息存入数据库,任务信息包括任务的执行时间、任务的下次执行时间以及任务提交人的id,任务提交人的id是任务主题内的唯一id,是对任务进行查询、追溯的重要依据;

步骤s110:判断当前第一线程池资源是否足够,若是,则创建关于该任务的新的任务处理线程并提交给第一线程池,执行步骤s120,若否,则执行步骤s130;

步骤s120:第一线程池启动其中的任务处理线程,对服务端发起调用;

在这一步骤中,如果任务调用失败,则将该任务放入缓存队列,若缓存队列已满,则将该任务放入数据库。若调用成功,则将此次调用的结果记录到数据库中。

步骤s130:判断缓存队列是否已满,若否,将该任务放入缓存队列,执行步骤s140,若是,则将该任务放入数据库,执行步骤s160;

在这一步骤中,虽然任务也放入到数据库中,但是,任务和调用结果记录在数据库中不同的数据列表里。

步骤s140:第一定时器定时扫描缓存队列,根据任务的执行时间取出缓存队列中需要执行的任务,放入第二线程池;

如图2和图3所示,在这一步骤中,缓存队列包括至少一个待执行队列和至少一个暂存队列,本实施例优选采用一个待执行队列1和一个暂存队列2,待执行队列1用于存放当前需要被执行的任务,暂存队列2用于存放当前调用失败或未到执行时间的任务。

在步骤s120中,如果任务调用失败,则将该任务放入缓存队列,若缓存队列已满,则将该任务放入数据库。具体而言,是将调用失败的任务放入暂存队列2,若暂存队列2已满,则放入数据库。

这一步骤还包括如下子步骤:

子步骤s141:第一定时器扫描待执行队列1,如图2或图3所示,执行队列1中存放有任务a、任务b和任务c;

子步骤s142:读取本次扫描的第一扫描时间11以及待执行队列1中每个任务的执行时间,判断任务的执行时间与第一扫描时间11的先后顺序。由于不同任务的执行时间不同,因此,第一定时器每次扫描的时间与每个任务应该被执行的时间必然存在时间差。以任务a为例,如图2所示,若任务a的执行时间在第一扫描时间11之前,说明任务a在第一扫描时间11之前就应当被执行,因此,将任务a放入第二线程池,如图3所示,若任务a的执行时间在第一扫描时间11之后,说明任务a应当在第一扫描时间11之后被执行,因此,将任务a放入暂存队列2,

子步骤s143:重复子步骤s141和子步骤s142,直至待执行队列1为空,即待执行队列1中的所有任务均被执行完成,此时,待执行队列1为空,暂存队列2则存有若干任务。

子步骤s144:将待执行队列1和暂存队列2相互对调,原来的暂存队列2变为待执行队列1’,原来的待执行队列1变为暂存队列2’;

子步骤s145:第一定时器扫描对调后的待执行队列1’,如图4或图5所示,对调后,待执行队列1’中存有任务d、任务e和任务f,这些任务为子步骤s142中放入暂存队列2的任务,或执行步骤s120、步骤s150或步骤s170时调用失败而放入的任务,在此不作限定;

子步骤s146:读取本次扫描的第二扫描时间11’以及对调后的待执行队列1’中每个任务的执行时间;

以任务d为例,如果任务d是执行子步骤s142时放入的任务,则执行时间同子步骤s142的执行时间,如果任务d是执行步骤s120、步骤s150或步骤s170时调用失败而放入的任务,则执行时间为相对于失败的调用所对应的执行时间而言,下一次执行的时间。

判断任务d的执行时间与第二扫描时间11’的先后顺序,由于不同任务的执行时间不同,因此,第一定时器再次扫描的时间与每个任务应该被执行的时间依然存在时间差。仍以任务d为例,如图4所示,若任务d的执行时间在第二扫描时间11’之前,说明任务d在第二扫描时间11’之前就应当被执行,因此,将任务d放入第二线程池,如图5所示,若任务d的执行时间在第二扫描时间11’之后,说明任务d应当在第二扫描时间11’之后被执行,因此,将任务d放入对调后的暂存队列2’;

子步骤s147:重复子步骤s145和子步骤s146,直至待执行队列1’为空,即待执行队列1’中的所有任务均被执行完成;

子步骤s148:再次将待执行队列1’和暂存队列2’相互对调,重复步骤s141至s147,直至缓存队列为空。

步骤s150:第二线程池启动其中的任务处理线程,对服务端进行调用;

在这一步骤中,如果任务调用失败,则将该任务放入暂存队列,若暂存队列已满,则将该任务放入数据库。若调用成功,则将此次调用的结果记录到数据库中。虽然任务也放入到数据库中,但是,任务和调用结果记录在数据库中不同的数据列表里。

步骤s160:第二定时器定时扫描处理器,根据任务的执行时间取出数据库中需要执行的任务,放入第三线程池;

在这一步骤中可以设定:若任务的执行时间在本次扫描时间之前,且任务的执行时间与本次扫描时间的时间差小于预定时间,则将该任务放入待执行队列。

步骤s170:第三线程池启动其中的任务处理线程,对服务端进行调用;

在这一步骤中,如果任务调用失败,则将该任务放入暂存队列,若暂存队列已满,则将该任务放入数据库。若调用成功,则将此次调用的结果记录到数据库中。虽然任务也放入到数据库中,但是,任务和调用结果记录在数据库中不同的数据列表里。

将现有技术中同步调用的客户端和服务端完成解耦,因此,服务端的变更减少了对客户端的影响。并且,将同步调用转为异步调用,不再阻塞等待结果,提高了处理的性能,客户端无需根据失败情况,自己去实现失败重试策略的代码,提供了灵活的、可定制的失败重试策略。

实施例二:

本实施例提供一种异步调用系统,包括:

配置模块,用于配置客户端应用名、服务端应用名、任务名称、任务的执行时间以及任务执行失败后任务的重试次数和重试间隔时间,在本实施例中,重试间隔时间可以是恒定时长,也可以是具有一定的梯度,即后一次重试间隔时间比前一次重试间隔时间略长,以此类推。本实施例中,优选采用重试间隔时间具有一定的梯度;

接收模块,用于接收客户端发来的任务,并将任务的任务信息存入数据库中,任务信息包括任务的执行时间、任务的下次执行时间以及任务提交人的id,任务提交人的id是任务主题内的唯一id,是对任务进行查询、追溯的重要依据;

第一线程池,用于启动其中任务的任务处理线程;

缓存队列,用于在第一线程池资源不足或任务执行失败时存放任务并等待执行;

缓存队列包括至少一个待执行队列和至少一个暂存队列,待执行队列存放当前需要被执行的任务,暂存队列存放当前调用失败或未到执行时间的任务,当任务调用失败时,调度模块将任务放入暂存队列,若暂存队列已满,调度模块将任务放入数据库。

数据库,用于在缓存队列已满时存放任务并等待执行,数据库还用于记录调用模块调用任务成功的结果。虽然任务也放入到数据库中,但是,任务和调用结果记录在数据库中不同的数据列表里。

第一定时器,用于定时扫描缓存队列;

第二定时器,用于定时扫描数据库;

第二线程池,用于启动其中任务的任务处理线程;

第三线程池,用于启动其中任务的任务处理线程;

调用模块,根据第一线程池、第二线程池和第三线程池中的任务对服务端发起调用;

调度模块,用于判断第一线程池资源是否充足以及缓存队列是否已满,若第一线程池资源不足,调度模块将任务放入缓存队列,所缓存队列已满,调度模块将任务放入数据库。

调度模块还用于:读取第一定时器扫描待执行队列的第一扫描时间以及待执行队列中任务的执行时间,判断任务的执行时间与第一扫描时间的先后顺序,若任务的执行时间在第一扫描时间之前,则将任务放入第二线程池,若任务的执行时间在第一扫描时间之后,则将该任务放入暂存队列,直至待执行队列为空,将待执行队列和暂存队列相互对调,第一定时器扫描对调后的待执行队列,读取本次扫描的第二扫描时间以及对调后的待执行队列中任务的第二执行时间或调用失败的任务的下次执行时间,判断第二执行时间或下次执行时间与第二扫描时间的先后顺序,若第二执行时间或下次执行时间在第二扫描时间之前,则将该任务放入第二线程池,若第二执行时间或下次执行时间在第二扫描时间之后,则将该任务放入对调后的暂存队列,直至对调后的待执行队列为空,重复前述操作,直至缓存队列为空。

在本实施例中,配置模块还可以配置预定时间,配置预定时间后,调度模块读取第二定时器的扫描时间和任务的执行时间,若任务的执行时间在本次扫描时间之前,且任务的执行时间与本次扫描时间的时间差小于预定时间,则将该任务放入待执行队列。

以上,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,熟悉该本领域的技术人员应该明白本发明包括但不限于附图和上面具体实施方式中描述的内容。任何不偏离本发明的功能和结构原理的修改都将包括在权利要求书的范围中。

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