前言:
最近在看线程池方面的内容,结合源码学习完其内部原理后,心想自己在项目中有实际使用过线程池吗?想了想,确实在项目中很多地方使用到了线程池;下面来简单聊下最近在日志方面中多线程的应用:
服务接口日志异步线程池化入库处理
定时任务中使用多线程进行日志清理
本文主线:
①、线程池基本原理解读;
②、线程池实际应用例子:
线程池应用 Demo 项目结构描述
服务接口日志异步线程池化入库处理
定时任务中使用多线程进行日志清理
线程池基本原理解读:
啥也不说,先贴一张脑图,通过脑图对线程池快速的进行了解;
除了看图外,也可以通过此文章《ava线程池实现原理及其在美团业务中的实践》对线程池进行详细的了解;
线程池实际应用例子:
下面就来聊聊最近在项目日志中线程池的应用;
线程池应用Demo项目描述:
上面说的两种日志方面线程池应用已经写好了Demo,是一个 SpringBoot 项目,项目结构如下图:
服务接口日志异步线程池化入库处理:
后台服务接口项目中,经常需要对接口的请求报文和响应报文日志做入库保存;
下面将通过对比 普通方式入库操作和线程池方式入库操作 ,来说说为什么线程池式入库更加优雅;
普通方式入库操作:
普通入库就是直接进行完业务逻辑处理并构建好响应后同时将日志进行入数据库,入库成功后再将响应返回;
流程图如下:
但是这样存在一个很大的弊端就是由于多了一次数据库操作(日志入库),进而可能会导致响应速度比较慢;
下面就聊聊怎么通过线程池对日志入库进行优化,提升接口的响应速度;
线程池方式入库操作:
线程池方式入库,可以将日志直接放入到队列中,然后就直接返回响应,最后使用线程池中的线程取出队列中的日志数据异步做入库操作;
流程图如下:
使用线程池方式,处理请求的主线程可以将日志放入到队列后,直接将响应返回,然后再使用线程池中的线程取出队列