业务需求中如何基于reactor模型来进行设计?
1. 模型图:
主从reactor多线程.png2. 需求实战
日常需求中,经常有批量创建类的相关需求。解决这种需求一般采用线程池或者MQ的做法。这里以线程池举例,来说下如何和Reactor模型建立关系。
前端一次上传提交任务,对于后端来说,这个任务应该是原子性的。若只是使用一个线程池的话,会存在接收m个子任务,拒绝n个子任务的场景。
所以需要一个线程池(Reactor子线程)去接受任务,并将接受的任务扁平化成m+n个子任务,交由另一个work线程池去处理子任务。
线程池的拒绝策略:
/**
* 接收和分发任务,当阻塞队列慢了之后,应该拒绝任务并抛出异常。
*/
private ExecutorService subReactorPool =
new ThreadPoolExecutor(3, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200));
/**
* 工作线程池,当阻塞队列满了之后,应该阻塞subReactorPool的线程
*/
private ExecutorService workPool =
new ThreadPoolExecutor(10, 20, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(600), (r, executor) -> {
try {
executor.getQueue().put(r); //自定义线程池拒绝策略
} catch (InterruptedException e) {
log.info("异常了", e);
}
});
设计图.png
代码实现起来并不复杂,但是思想却是和Reactor模型有一些共同之处,且均是为实现异步非阻塞。
网友评论