成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

吞吐量飆升10倍!Spring Boot 異步接口架構(gòu)實(shí)戰(zhàn)與性能對(duì)比全解析

開發(fā) 前端
Spring Boot 中實(shí)現(xiàn)異步接口是一種優(yōu)化吞吐量的有力手段,特別適用于高并發(fā)、I/O 密集型場(chǎng)景。根據(jù)需求選擇 Callable、WebAsyncTask? 或 DeferredResult 并結(jié)合線程池配置,能夠極大提升系統(tǒng)的并發(fā)處理能力。

在傳統(tǒng) Servlet 3.0 之前的 Java Web 應(yīng)用中,每一次 HTTP 請(qǐng)求都必須由一個(gè)獨(dú)立線程全程處理完畢。這樣的模型在并發(fā)量陡增時(shí)壓力巨大,服務(wù)端線程資源成為瓶頸。

Servlet 3.0 引入了異步處理機(jī)制,讓服務(wù)器能夠先暫時(shí)釋放線程和資源,從而緩解系統(tǒng)壓力,顯著提升整體并發(fā)處理能力。在 Spring Boot 環(huán)境下,異步接口的實(shí)現(xiàn)手段豐富多樣,常見的包括:

  • Callable
  • WebAsyncTask
  • DeferredResult

??注意:本篇不包含 ResponseBodyEmitter、SseEmitter 和 StreamingResponseBody 的講解,后續(xù)將單獨(dú)成文展開。

使用 Callable 實(shí)現(xiàn)異步接口

在 Spring 控制器中,只要你將接口返回類型定義為 Callable<T>,該接口就自動(dòng)轉(zhuǎn)變?yōu)楫惒綀?zhí)行:

@GetMapping("/testCallAble")
public Callable<String> testCallAble() {
    return () -> {
        Thread.sleep(40000);
        return "hello";
    };
}

對(duì)客戶端而言,這種異步機(jī)制是“透明”的——無(wú)論服務(wù)端是否異步處理,客戶端獲取的結(jié)果是一樣的。

Callable 的處理機(jī)制:

  1. 控制器返回 Callable。
  2. Spring MVC 調(diào)用 HttpServletRequest.startAsync()。
  3. 系統(tǒng)使用 AsyncTaskExecutor 在獨(dú)立線程中執(zhí)行 Callable。
  4. 異步結(jié)果生成后,重新回到 DispatcherServlet 完成響應(yīng)。

默認(rèn)情況下,Spring 使用 SimpleAsyncTaskExecutor,不具備線程重用能力。實(shí)際應(yīng)用中應(yīng)配置線程池以獲得更優(yōu)性能。

WebAsyncTask:增強(qiáng)型異步支持

相比 Callable,WebAsyncTask 增加了對(duì)“超時(shí)”、“異常”、“完成”等事件的監(jiān)聽支持,推薦用于生產(chǎn)環(huán)境:

@GetMapping("/webAsyncTask")
public WebAsyncTask<String> webAsyncTask() {
    WebAsyncTask<String> task = new WebAsyncTask<>(30003, () -> "success");


    task.onTimeout(() -> {
        log.info("請(qǐng)求超時(shí)");
        return "timeout callback";
    });


    task.onCompletion(() -> log.info("異步調(diào)用已結(jié)束"));


    return task;
}

值得注意的是:WebAsyncTask 設(shè)置的超時(shí)時(shí)間會(huì)覆蓋 Spring 全局異步超時(shí)配置。

DeferredResult:結(jié)果“延后”提交

和 Callable 不同,DeferredResult 可以“晚點(diǎn)”設(shè)置結(jié)果。適用于某些業(yè)務(wù)需要等待其他線程或系統(tǒng)響應(yīng)的場(chǎng)景:

private Map<String, DeferredResult<String>> deferredResultPool = new ConcurrentHashMap<>();


@GetMapping("/testDeferredResult")
public DeferredResult<String> testDeferredResult() {
    DeferredResult<String> dr = new DeferredResult<>();
    deferredResultPool.put("test", dr);
    return dr;
}

上面的接口會(huì)一直掛起,直到你調(diào)用另一個(gè)接口設(shè)置返回結(jié)果:

@GetMapping("/testSetDeferredResult")
public String testSetDeferredResult() {
    DeferredResult<String> dr = deferredResultPool.get("test");
    boolean success = dr.setResult("響應(yīng)成功");


    if (!success) {
        log.info("已失效,無(wú)法再次設(shè)置結(jié)果");
    }


    return "ok";
}

提示:

  • DeferredResult.isSetOrExpired() 可用于判斷是否已完成或過(guò)期。
  • 實(shí)際應(yīng)用中,需定期清理未完成的請(qǐng)求,避免內(nèi)存泄露。

配置自定義線程池用于異步執(zhí)行

Spring 默認(rèn)提供的異步線程執(zhí)行器并不適用于高并發(fā)生產(chǎn)環(huán)境,建議手動(dòng)配置線程池:

@Bean("mvcAsyncTaskExecutor")
public AsyncTaskExecutor asyncTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(10);
    executor.setQueueCapacity(10);
    executor.setThreadNamePrefix("async-mvc-thread-");
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
    executor.setWaitForTasksToCompleteOnShutdown(true);
    executor.setAwaitTerminationSeconds(30);
    executor.initialize();
    return executor;
}

配置線程池進(jìn) WebMvcConfigurer:

@Configuration
public class WebAsyncConfig implements WebMvcConfigurer {


    @Autowired
    @Qualifier("mvcAsyncTaskExecutor")
    private AsyncTaskExecutor taskExecutor;


    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(60001);
        configurer.setTaskExecutor(taskExecutor);
    }
}

什么時(shí)候考慮使用異步處理?

異步接口并非萬(wàn)能藥。你應(yīng)優(yōu)先考慮異步接口的場(chǎng)景是:

  • 業(yè)務(wù)邏輯中存在大量等待操作(如遠(yuǎn)程接口調(diào)用、數(shù)據(jù)庫(kù)慢查詢)
  • 請(qǐng)求處理期間 CPU 并未持續(xù)活躍(可釋放計(jì)算資源)

但如果接口中包含大量計(jì)算密集型操作(如加密、壓縮、圖像處理等),使用異步不會(huì)帶來(lái)性能提升,反而會(huì)產(chǎn)生線程調(diào)度成本。

小結(jié)

Spring Boot 中實(shí)現(xiàn)異步接口是一種優(yōu)化吞吐量的有力手段,特別適用于高并發(fā)、I/O 密集型場(chǎng)景。根據(jù)需求選擇 Callable、WebAsyncTask 或 DeferredResult 并結(jié)合線程池配置,能夠極大提升系統(tǒng)的并發(fā)處理能力。

如果你正在構(gòu)建對(duì)響應(yīng)速度要求不敏感但處理周期長(zhǎng)的接口,異步機(jī)制或許正是你的“突破點(diǎn)”。

責(zé)任編輯:武曉燕 來(lái)源: 路條編程
相關(guān)推薦

2025-05-09 02:00:00

代碼接口吞吐量

2024-12-13 13:58:53

2024-09-09 14:12:38

2024-09-12 15:24:29

2024-09-14 11:31:27

@AsyncSpring異步

2025-05-27 02:00:00

2021-01-27 11:50:07

Python優(yōu)化代碼

2024-10-09 11:31:51

2025-02-17 09:32:18

2024-01-19 13:42:00

模型訓(xùn)練

2024-11-01 13:30:56

2024-10-07 08:40:56

Spring應(yīng)用程序Java

2013-04-19 09:45:20

AMPLabHadoopHDFS

2024-05-23 16:41:40

2011-08-25 17:29:40

LUAPHPWEB

2024-11-02 10:28:03

2013-04-25 10:38:40

思科存儲(chǔ)交換機(jī)

2021-12-26 00:03:27

響應(yīng)式編程異步

2025-04-16 08:25:00

2023-11-07 15:11:46

Kafka技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 97国产精品视频 | 黄色精品视频网站 | 成人三级网址 | 日韩在线观看 | 91香蕉视频在线观看 | 成年免费在线观看 | 久久99精品国产自在现线小黄鸭 | 久久久久久久久淑女av国产精品 | 精品在线观看入口 | xxxxx黄色片| 91久久久久久久久久久 | 中国一级特黄真人毛片免费观看 | 精品乱人伦一区二区三区 | 成人在线免费视频 | 日韩精品在线观看一区二区三区 | 国产精品久久久久久久午夜片 | 99成人| 免费看黄视频网站 | 午夜国产 | 91精品久久久久久久 | 久久精品国产一区二区电影 | 成人不卡一区二区 | 欧美aⅴ | 一级午夜aaa免费看三区 | 欧美一区二区三区 | 久久伊| 国产成人久久精品一区二区三区 | 国产成人精品久久二区二区 | 午夜影院在线观看 | 视频一区在线 | 色偷偷人人澡人人爽人人模 | 一级黄色淫片 | 欧美日韩精品区 | 亚洲性人人天天夜夜摸 | 欧美日本在线观看 | 黑人粗黑大躁护士 | 伊人中文字幕 | 日本精品一区二区三区在线观看视频 | 国产日韩欧美在线 | 中文字幕日韩欧美 | 国产精品福利久久久 |