一种面向作业流(工作流)的轻量级可复用的异步流水开发框架JobFlow的设计与实现
要做这个东东的想法由来以久了的说,一个月以前动手把代码实现了下来,今天觉得如果实在不写成博文记录下来的话,不知又要推到何年何月了。嗯,废话不多说,直入正题了~
在实际的开发过程中,我们经常会遇到这样的情况:海量的并发用户发送请求要求服务器处理,而服务器集群之间彼此也经常会传递请求,用于完成特定的任务。我们可以把处理每个请求的过程理解为是一种任务的执行,这样的话,就相当于有一堆的作业摆在那时需要执行。而我们所要关心的是作业的数据结构是如何描述的、作业是如何存放、如何取出的以及是如何执行的。
基于上述的思路,我们可以将任何的操作流程封装在一个Job里,并将其丢入到一个Job池中,Job池最好设置成阻塞模式,这样即可唤醒等待的多个处理器从Job池中取出Job并执行。这样一个框架的形成就牵涉到了宏观设计的问题:即Job、Job池及处理器这三种最重要的资源是如何定义和组织的。JobFlow整体的框架结果如下图所示:
为了便于简化开发过程,使用的开发语言为Java,但这种设计思路是基于面向对象的,具备普适意义,感兴趣的可以自己实现C++版本。代码的组织结构截图如下:
一、Job作业的设计
Job即是对处理某个任务/作业执行流程的一种抽象,Job接口提供一个最重要的方法:run(),我们可以定义具体的Job类,实现run()方法,用于填充必要的业务逻辑,在run()执行过程中可能会产生新的Job。按照这样的思路,我们可以在一个大Job的run()方法定义相关的执行流程,从而派生出若干个小Job,继而实现了对一个大Job的拆分过程,同时每小Job也还可以继续做拆分…
如下图所示,简单地举例:我们定义了加法Job、减法Job、乘法Job及除法Job,每种Job均实现了Job接口,对于run()方法做了对应的填充,分别实现了两个数的相加、相减、相乘和相除。
二、作业池JobPool的设计
既然生成了Job