当前位置:网站首页>异步Servlet在转转图片服务的实践
异步Servlet在转转图片服务的实践
2022-07-25 09:41:00 【InfoQ】
一、问题背景
二、排查问题
18:20
- 有大对象直接进入老年代
- 对象不断在创建并且一直存活,即内存泄漏
18:20
jpsjstack
socketRead0() PictureUploadServiceImplgetInputSreamFromUrl() 三、解决方案
3.1 初步方案
- Tomcat最大线程数设置了1000
- 下载URL的超时时间设置了5000ms
3.2 新的问题

MultipartFile
<T> Future<T> submit(Callable<T> task);
future.get()submit()3.3 异步Servlet
3.3.1 Servlet3.0规范
@WebServlet(URLPatterns = "/async",asyncSupported = true)
public class AsyncServlet extends HttpServlet {
ExecutorService executorService =Executors.newSingleThreadExecutor();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 开启异步,获取异步上下文
final AsyncContext ctx = req.startAsync();
//2. 提交线程池异步执行
executorService.execute(new Runnable() {
@Override
public void run() {
try {
//3.模拟任务并输出
Thread.sleep(10000L);
ServletResponse response = ctx.getResponse();
outputStream = response.getOutputStream();
outputStream.write("task complete".getBytes(StandardCharsets.UTF_8));
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
//4. 执行完成后完成回调
ctx.complete();
}
});
}
}
3.3.2 Tomcat实现
req.startAsync()ctx.complete()req.startAsync() - 设置当前请求为一个异步类型的请求
- 把当前的请求的request和response保存在一个上下文对象中
ctx.complete()ctx.complete()ctx.complete()3.3.3 Spring MVC实现
@RequestMapping("/quotes")
@ResponseBody
public DeferredResult<String> quotes() {
DeferredResult<String> deferredResult = new DeferredResult<String>();
// Save the deferredResult somewhere..
return deferredResult;
}
// In some other thread...
deferredResult.setResult(data);
DeferredResultDeferredResultDispatchServletDeferredResultdeferredResult.setResult(data)3.4 最终方案
- 针对减少FullGC:
- 调整Tomcat线程数200
- 调整下载图片超时时间2000ms
- 针对线程隔离:
- 使用线程池 + DeferredResult 进行异步处理和同步返回
@RestController
public class PictureUploadController {
private ExecutorService threadPool = new ThreadPoolExecutor(16, 16, 30, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(5000), new ThreadFactory() {
private final AtomicInteger uploadUrlPicThreadNum = new AtomicInteger(1);
@Override
public Thread newThread(Runnable runnable) {
Thread thread = Executors.defaultThreadFactory().newThread(runnable);
thread.setName("uploadUrlPicThread-" + uploadUrlPicThreadNum.getAndIncrement());
return thread;
}
}, new ThreadPoolExecutor.DiscardOldestPolicy());
@Autowired
PictureUploadService pictureUploadService;
@PostMapping("/asyncUpload")
public DeferredResult<ApiResult> asyncUploadPicture(@Valid PictureUploadDTO pictureUploadDTO) {
//1. 构建DeferredResult对象,设置超时时间
DeferredResult<ApiResult> deferredResult = new DeferredResult<>(5000);
threadPool.execute(new Runnable() {
@Override
public void run() {
//2.异步上传图片
apiResult = pictureUploadService.upload(pictureUploadDTO);
//3.设置返回值
deferredResult.setResult(apiResult);
}
});
return deferredResult;
}
}
四、总结
- 异步Servlet,释放容器(Tomcat)工作线程,耗时处理在子线程中且返回结果可通过子线程返回。
- 关键词:耗时、释放容器线程、子线程返回结果数据。
- 异步化后,快速释放容器工作线程,提升容器响应更多客户端请求。
- 当应用明确有耗时请求和非耗时请求时,采用异步技术,可以达到耗时请求隔离效果,即耗时请求不占用容器线程,容器更好地为非耗时请求提供服务。
- 配置中心Apollo配置更新使用异步Servlet技术。
- Dubbo服务端异步实现原理AsyncContext技术。
- 阿里开源Nacos更新配置使用异步Servlet技术。
边栏推荐
- 1、 The difference between unittest framework and pytest framework
- Angr (I) - Installation
- Angr(二)——angr_ctf
- 部署主从数据库
- 【蓝桥杯集训100题】scratch太极图 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第22题
- Deadlock event of thread pool
- AI技术栈太庞大!吴恩达给出职业生涯规划:终生学习
- 使用px2rem不生效
- 如何通过开源数据库管理工具 DBeaver 连接 TDengine
- After switching the shell command line terminal (bash/zsh), CONDA cannot be used: command not found
猜你喜欢
随机推荐
2.shell脚本之条件语句
21. Merge Two Sorted Lists
When installing mysql, string the service installation failure > mysql80 startup failure
Vs Code connects to the remote jupyter server
推荐系统-协同过滤在Spark中的实现
Angr (IV) -- angr_ ctf
Number theory --- the greatest common divisor and the least common multiple
3. Believe you can understand! Circular statements and functions of shell scripts, arrays, bubble sorting
Angr(一)——安装
Angr (VIII) -- angr_ ctf
UE4 external open EXE file
5. NFS shared services and SSH Remote Control Services
The ultimate summary of jsonobject parsing JSON format
2021 jd.com written examination summary
思路再次完美验证!加息临近,趋势明了,好好把握这波行情!
MySQL offline deployment
Attention is all you need paper intensive reading notes transformer
Pytorch code template (CNN)
Mysql离线部署
Modify MySQL group error expression 1 of select list is not in group









