如何处理消耗大内存的后台任务(线程池)WorkEngine

我们都知道,很多后台任务,都是很消耗资源和内存的。

例如,把很多数据从DB拿出来以后,拼装生成一个Excel,Excel往往是消耗内存的,因为除了数据Excel还存储了很多格式信息。如果很多用户同时提交导出Excel的操作,那么server将会吃不消。

所以,我们需要把这些任务进行分批处理。如何分批处理呢?最好的办法,是根据server的承受能力,设置同一时间能够处理的任务数,然后让几百个request在一个queue里面等待处理。

当然,这些操作最好是异步的,因为后台的操作时间往往是漫长的,所以,不要让前端为这些繁杂的任务执行而做等待。

这个可以说是一个“线程池”的概念。简单的雏形如下:

 

 

 

但实际中的线程池可以是更加复杂的,因为一个任务可以分为粒度更小的子任务。

比如说,导出Excel可以分为好几个阶段,而每个阶段所消耗的资源又是不一样的。

所以每个阶段,server能够承担的任务数量又是不一样的。

导出Excel分为三个阶段,那么要开启三种不同的线程池,而每个池中的线程数量又是不一样的。

阶段1:校验DB数据,这个因为纯数据不会消耗太多的CPU和MEM,所以大家都可以比较快做完,

所以,可以把这个阶段的线程池的线程数量调成20.

阶段2:是生成Excel的阶段,这时候需要消耗较多的资源那么做完校验的任务,可以再这个阶段排一下队。

。。。

 

 

 

 

 

你可能感兴趣的:(java,线程池,job)