当前位置:网站首页>异步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技术。
边栏推荐
- Supervisor deployment (offline deployment requires downloading the deployment package in advance)
- 21. Merge Two Sorted Lists
- DHCP configuration (take Huawei ENSP as an example)
- 2021 CEC笔试总结
- Deploy master-slave database
- Pytoch separates tensor by the value of one dimension of tensor (simple)
- 2021 牛客网笔试总结 01
- Basic concepts of testing
- MySQL solves the problem of not supporting Chinese
- Install MySQL database version 5.7.29 under ubuntu20.04 system
猜你喜欢

5. NFS shared services and SSH Remote Control Services

Virtual private line network deployment

4.FTP服务配置与原理

5.NFS共享服务和ssh远程控制服务

Fastdfs离线部署(图文)

js 哈希表 01

Supervisor deployment (offline deployment requires downloading the deployment package in advance)

Pow(x,n)

虚拟专线网络部署

UE4 quickly find the reason for packaging failure
随机推荐
Angr(十)——官方文档(Part1)
淦,为什么 '𠮷𠮷𠮷' .length !== 3 ??
js 集合
UE4 quickly find the reason for packaging failure
Redis usage scenario
Research summary of voice self-monitoring pre training model CNN encoder
【策略模式】就像诸葛亮的锦囊
2、 What does the unittest framework do
Number theory -- Research on divisor
2. Conditional statements of shell script
Pytorch calculates the loss for each sample in the batch
js 哈希表 01
Virtual private line network deployment
User preferences
Notes on building dompteur container
JS encryption parameter positioning
What is the meaning of ordinary people's life?
10. Expect interaction free
5. NFS shared services and SSH Remote Control Services
UE4 external open EXE file