偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Spring MVC異步處理架構(gòu)實戰(zhàn):線程池+消息隊列+事件驅(qū)動+反應(yīng)式高并發(fā)性能優(yōu)化

開發(fā) 前端
在高并發(fā)的分布式系統(tǒng)中,異步處理已成為提升性能、保障穩(wěn)定性的核心技術(shù)手段。本文通過 + 15個真實代碼案例,帶你徹底掌握。

在高并發(fā)的分布式系統(tǒng)中,異步處理已成為提升性能、保障穩(wěn)定性的核心技術(shù)手段。本文通過 + 15個真實代碼案例,帶你徹底掌握:

  1. 異步 vs 同步的核心抉擇
  • 何時該用異步?(日志記錄、消息推送)
  • 何時必須同步?(支付交易、庫存扣減)
  • 從 電商訂單 到 物聯(lián)網(wǎng)指令 的六大場景深度對比
  1. 四大異步方案實戰(zhàn)
  • 線程池優(yōu)化:Spring @Async 配置陷阱與性能調(diào)優(yōu)
  • 消息隊列:RabbitMQ 如何實現(xiàn)可靠異步通信(含死信隊列設(shè)計)
  • 事件驅(qū)動:Spring Events 解耦業(yè)務(wù)模塊的最佳實踐
  • 反應(yīng)式編程WebFlux 在IO密集型場景的碾壓式優(yōu)勢
  1. 血的教訓(xùn)
  • 異步處理支付導(dǎo)致 資金損失 的案例
  • 庫存扣減異步化引發(fā) 超賣事故 的復(fù)盤
  • 從CAP理論看異步與一致性的 終極權(quán)衡

異步處理原則

一、異步處理方式全景圖

1.1 異步方式選擇

圖片圖片

1.2 異步?jīng)Q策樹

圖片圖片

二、架構(gòu)設(shè)計圖

圖片圖片

三、實現(xiàn)說明

原則核心:將耗時操作異步化,快速釋放請求線程

未實現(xiàn)前代碼

@PostMapping("/order")
publicResultcreateOrder(@RequestBodyOrderDTO dto){
// 同步處理所有邏輯
    orderService.validate(dto);// 校驗
    orderService.lockStock(dto);// 鎖庫存
    orderService.create(dto);// 創(chuàng)建訂單(數(shù)據(jù)庫IO)
    orderService.sendSms(dto);// 發(fā)短信(網(wǎng)絡(luò)IO)
returnResult.success();
}

問題:線程被長時間占用,并發(fā)能力低

實現(xiàn)后代碼

// 配置線程池
@Configuration
publicclassAsyncConfigimplementsAsyncConfigurer{
@Override
publicExecutorgetAsyncExecutor(){
ThreadPoolTaskExecutor executor =newThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(1000);
        executor.setThreadNamePrefix("Async-Executor-");
        executor.initialize();
return executor;
}
}

@Service
publicclassAsyncOrderService{
@Async// 異步方法
publicvoidasyncCreateOrder(OrderDTO dto){
        orderService.validate(dto);
        orderService.lockStock(dto);
        orderService.create(dto);
}

@Async
publicvoidasyncSendSms(OrderDTO dto){
        orderService.sendSms(dto);
}
}

@RestController
publicclassOrderController{
@Autowired
privateAsyncOrderService asyncOrderService;

@PostMapping("/order")
publicResultcreateOrder(@RequestBodyOrderDTO dto){
// 主流程同步處理
        orderService.validate(dto);

// 異步處理耗時操作
        asyncOrderService.asyncCreateOrder(dto);
        asyncOrderService.asyncSendSms(dto);

returnResult.success("訂單處理中");
}
}

優(yōu)勢

  • 請求響應(yīng)時間從2s降低到200ms
  • Tomcat線程池利用率從90%降到30%
  • 系統(tǒng)吞吐量提升5倍

四、各種異步處理實現(xiàn)方式詳解

4.1. 線程池方式(@Async)

適用場景:短耗時任務(wù)(<1秒),如日志記錄、通知發(fā)送

@Configuration
@EnableAsync
publicclassAsyncConfigimplementsAsyncConfigurer{

@Override
publicExecutorgetAsyncExecutor(){
ThreadPoolTaskExecutor executor =newThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(50);
        executor.setQueueCapacity(1000);
        executor.setThreadNamePrefix("Async-Executor-");
        executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
return executor;
}
}

@Service
publicclassNotificationService{

@Async// 使用默認線程池
publicvoidsendSms(String phone,String content){
// 模擬耗時操作
Thread.sleep(300);
        smsClient.send(phone, content);
}

@Async("emailExecutor")// 指定特定線程池
publicvoidsendEmail(Email email){
        emailSender.send(email);
}
}

參數(shù)調(diào)優(yōu)建議

  • corePoolSize:CPU密集型建議N+1,IO密集型建議2N(N=CPU核心數(shù))
  • queueCapacity:根據(jù)任務(wù)平均處理時間和可接受延遲設(shè)置

4.2. 消息隊列方式(RabbitMQ)

適用場景:跨服務(wù)異步、削峰填谷、保證最終一致性

@Configuration
publicclassRabbitConfig{

@Bean
publicQueueorderQueue(){
returnnewQueue("order.queue",true);// 持久化隊列
}
}

@Component
publicclassOrderMessageSender{

@Autowired
privateRabbitTemplate rabbitTemplate;

publicvoidsendCreateOrder(Order order){
        rabbitTemplate.convertAndSend(
"order.exchange",
"order.create",
            order,
            message ->{
                message.getMessageProperties().setPriority(5);// 設(shè)置優(yōu)先級
return message;
});
}
}

@Component
@RabbitListener(queues ="order.queue")
publicclassOrderMessageHandler{

publicvoidhandleCreateOrder(Order order){
        orderService.processOrderCreation(order);
}
}

消息可靠性保障

  • 生產(chǎn)者確認模式(publisher confirms)
  • 消費者手動ACK
  • 死信隊列處理失敗消息

4.3. 事件驅(qū)動方式(Spring Events)

適用場景:應(yīng)用內(nèi)部模塊解耦

// 定義領(lǐng)域事件
publicclassOrderCreatedEventextendsApplicationEvent{
privateOrder order;
publicOrderCreatedEvent(Object source,Order order){
super(source);
this.order = order;
}
// getter...
}

@Service
publicclassOrderService{

@Autowired
privateApplicationEventPublisher eventPublisher;

@Transactional
publicOrdercreateOrder(OrderDTO dto){
Order order =convertToOrder(dto);
        orderRepository.save(order);

// 發(fā)布領(lǐng)域事件
        eventPublisher.publishEvent(newOrderCreatedEvent(this, order));
return order;
}
}

@Component
publicclassOrderEventHandler{

@EventListener
@Async
publicvoidhandleOrderCreated(OrderCreatedEvent event){
// 發(fā)送通知
        notificationService.sendOrderCreated(event.getOrder());

// 更新統(tǒng)計數(shù)據(jù)
        statsService.updateOrderStats(event.getOrder());
}
}

4.4. 反應(yīng)式編程(WebFlux)

適用場景:高并發(fā)IO密集型服務(wù)

@RestController
@RequestMapping("/products")
publicclassProductController{

@GetMapping("/{id}")
publicMono<Product>getProduct(@PathVariableString id){
return productReactiveRepository.findById(id)
.timeout(Duration.ofMillis(500))
.onErrorResume(e ->Mono.just(getFallbackProduct()));
}

@PostMapping
publicMono<Void>createProduct(@RequestBodyMono<Product> product){
return product
.flatMap(p -> productReactiveRepository.save(p))
.then();
}
}

五、不適合異步處理的業(yè)務(wù)場景

圖片圖片

5.1  核心業(yè)務(wù)(O)

不能異步的原因

  • 關(guān)鍵路徑依賴:核心業(yè)務(wù)是用戶操作的主流程,異步化會導(dǎo)致流程斷裂
  • 用戶體驗破壞:用戶需要立即知曉操作結(jié)果(如支付成功/失?。?/span>
  • 故障難以恢復(fù):失敗后補償邏輯復(fù)雜,可能造成業(yè)務(wù)損失

典型反例

// 同步處理支付(必須立即返回結(jié)果)
@PostMapping("/payment")
publicPaymentResultprocessPayment(@RequestBodyPaymentRequest request){
// 同步執(zhí)行所有核心步驟
    validationService.validate(request);
    balanceService.debit(request.getAccount(), request.getAmount());
    paymentRecordService.create(request);

returnPaymentResult.success();// 必須同步返回
}

5.2 強一致性要求(P)

不能異步的原因

  • 數(shù)據(jù)實時可見:后續(xù)操作依賴最新狀態(tài)(如庫存扣減)
  • 避免臟讀風(fēng)險:異步可能導(dǎo)致其他線程讀到中間狀態(tài)
  • 事務(wù)完整性:跨服務(wù)調(diào)用需要同步事務(wù)協(xié)調(diào)

典型反例

@Transactional
publicvoidplaceOrder(Order order){
// 必須同步保證庫存和訂單的強一致
    inventoryService.lockStock(order.getItems());// 同步調(diào)用
    orderRepository.save(order);

// 非核心操作可以異步
    asyncService.logOrderActivity(order);
}

5.3 需要即時反饋(Q)

不能異步的原因

  • 用戶交互需求:前端需要立即展示結(jié)果(如表單提交)
  • 避免輪詢復(fù)雜度:減少客戶端狀態(tài)輪詢邏輯
  • 操作連續(xù)性:下一步操作依賴當前結(jié)果(如兩步驗證)

典型反例

// 用戶登錄必須同步返回token
@PostMapping("/login")
publicAuthResultlogin(@RequestBodyLoginRequest request){
User user = authService.authenticate(request);// 同步驗證
String token = tokenService.generate(user);
returnnewAuthResult(token);// 立即返回
}

5.4 事務(wù)邊界內(nèi)操作(R)

不能異步的原因

  • 事務(wù)原子性:異步操作無法加入數(shù)據(jù)庫事務(wù)
  • 臟數(shù)據(jù)風(fēng)險:主事務(wù)回滾時異步操作已執(zhí)行
  • 執(zhí)行順序問題:異步可能導(dǎo)致后續(xù)操作先于前置完成

典型反例

@Transactional
publicvoidupdateProfile(User user){
// 同步執(zhí)行(必須在事務(wù)內(nèi))
    userDao.update(user);
    permissionService.refresh(user.getId());// 同步調(diào)用

// 異步操作會導(dǎo)致事務(wù)問題:
// asyncService.logUserUpdate(user); ?
}

解決方案

@Transactional
publicvoidupdateProfile(User user){
    userDao.update(user);
    permissionService.refresh(user.getId());

// 事務(wù)提交后再異步處理
TransactionSynchronizationManager.registerSynchronization(
newTransactionSynchronization(){
@Override
publicvoidafterCommit(){
                asyncService.logUserUpdate(user);
}
}
);
}

5.5 簡單查詢(S)

不能異步的原因

  • 性能反模式:異步開銷可能超過查詢本身
  • 代碼復(fù)雜度:Future/Callback增加理解成本
  • 資源浪費:線程切換消耗高于直接查詢

性能對比

查詢類型

同步耗時

異步耗時(含線程切換)

主鍵查詢(1ms)

1ms

10ms+

簡單JOIN(5ms)

5ms

15ms+

正確實踐

// 直接同步查詢
@GetMapping("/users/{id}")
publicUsergetUser(@PathVariableString id){
return userDao.findById(id);// 簡單查詢無需異步
}

5.6 總結(jié):不能異步的核心本質(zhì)

場景

核心矛盾

技術(shù)限制

業(yè)務(wù)風(fēng)險

核心業(yè)務(wù)

流程連續(xù)性與異步斷點

無法保證操作原子性

業(yè)務(wù)流程中斷

強一致性

數(shù)據(jù)新鮮度與延遲不可調(diào)和

CAP理論約束

數(shù)據(jù)不一致

即時反饋

用戶交互的實時性要求

前端狀態(tài)管理復(fù)雜度

用戶體驗差

事務(wù)邊界內(nèi)

事務(wù)ACID與異步不可控的矛盾

分布式事務(wù)實現(xiàn)復(fù)雜度

數(shù)據(jù)污染

簡單查詢

性能收益與異步開銷的負向博弈

線程上下文切換成本

系統(tǒng)吞吐量下降

通過理解這些底層限制,可以更準確地判斷何時應(yīng)該避免異步化設(shè)計。同步與異步的選擇本質(zhì)上是一致性、可用性性能之間的權(quán)衡(CAP三角的具象化表現(xiàn))。

5.7. 典型不適用場景示例

5.7.1 支付處理

錯誤異步實現(xiàn)

@PostMapping("/pay")
publicResultpay(@RequestBodyPaymentRequest request){
// 錯誤:異步處理支付核心邏輯
    paymentService.asyncProcessPayment(request);
returnResult.success("處理中");
}

問題分析

  • 無法即時返回支付結(jié)果
  • 難以處理支付失敗情況
  • 客戶端需要復(fù)雜輪詢機制

正確同步實現(xiàn)

@PostMapping("/pay")
@Transactional
publicResultpay(@RequestBodyPaymentRequest request){
// 同步處理支付
PaymentResult result = paymentService.process(request);

// 同步記錄交易
    transactionService.record(result);

returnResult.success(result);
}

5.7.2 庫存扣減

錯誤異步實現(xiàn)

publicvoidplaceOrder(Order order){
// 錯誤:異步扣減庫存
    inventoryService.asyncReduceStock(order.getItems());

// 可能造成超賣
    orderDao.save(order);
}

正確實現(xiàn)

@Transactional
publicvoidplaceOrder(Order order){
// 先同步扣減庫存
    inventoryService.reduceStock(order.getItems());

// 再創(chuàng)建訂單
    orderDao.save(order);

// 其他非關(guān)鍵操作異步化
    eventPublisher.publishEvent(newOrderCreatedEvent(order));
}

六、適合異步處理的業(yè)務(wù)場景

圖片圖片

6.1 非核心路徑業(yè)務(wù)

為什么能異步:

  • 不影響主流程:這些業(yè)務(wù)不是用戶操作的關(guān)鍵路徑,即使延遲或失敗也不會直接影響主要功能
  • 故障隔離:異步執(zhí)行可以將非核心業(yè)務(wù)的故障與核心流程隔離
  • 資源分配優(yōu)先級:系統(tǒng)資源可以優(yōu)先保障核心業(yè)務(wù)

典型場景:

  • 用戶行為日志記錄
  • 操作審計跟蹤
  • 數(shù)據(jù)分析收集

實現(xiàn)示例:

// 同步方式(不推薦)
@PostMapping("/order")
publicOrdercreateOrder(OrderDTO dto){
Order order = orderService.create(dto);// 核心業(yè)務(wù)
    logService.recordOperationLog("create_order", dto);// 非核心日志
return order;
}

// 異步優(yōu)化
@PostMapping("/order")
publicOrdercreateOrder(OrderDTO dto){
Order order = orderService.create(dto);// 同步處理核心

// 異步處理非核心日志
CompletableFuture.runAsync(()->{
        logService.recordOperationLog("create_order", dto);
}, asyncExecutor);

return order;
}

6.2 允許延遲的業(yè)務(wù)

為什么能異步:

  • 時間容忍度高:業(yè)務(wù)本身對處理時效要求不高(秒級甚至分鐘級延遲可接受)
  • 批量處理機會:可以積累一定量后批量處理,提高效率
  • 最終一致性:不需要實時強一致,只要最終數(shù)據(jù)正確即可

典型場景:

  • 報表生成
  • 數(shù)據(jù)統(tǒng)計分析
  • 推薦系統(tǒng)更新

實現(xiàn)示例:

// 用戶行為分析處理
@EventListener
@Async
publicvoidhandleUserBehaviorEvent(UserBehaviorEvent event){
// 延遲5分鐘處理,積累更多數(shù)據(jù)
TimeUnit.MINUTES.sleep(5);

// 批量處理期間收集的所有事件
List<UserBehaviorEvent> events = eventBuffer.getEvents(event.getUserId());
    analysisService.processUserBehavior(events);
}

6.3 無需即時反饋的業(yè)務(wù)

為什么能異步:

  • 客戶端無等待需求:用戶不需要立即知道處理結(jié)果
  • 后臺靜默處理:結(jié)果可以通過其他渠道通知(如郵件、站內(nèi)信)
  • 降低交互復(fù)雜度:避免前端長時間等待響應(yīng)

典型場景:

  • 大文件導(dǎo)出
  • 系統(tǒng)消息推送
  • 后臺數(shù)據(jù)處理任務(wù)

實現(xiàn)示例:

@PostMapping("/export")
publicResponseEntity<String>exportLargeData(@RequestBodyExportRequest request){
// 立即返回任務(wù)ID
String taskId =generateTaskId();

// 異步執(zhí)行導(dǎo)出
    exportService.asyncExport(taskId, request);

returnResponseEntity.accepted()
.header("Location","/tasks/"+taskId)
.body("{"taskId":""+taskId+""}");
}

// 客戶端可以通過taskId輪詢狀態(tài)
@GetMapping("/tasks/{taskId}")
publicTaskStatusgetTaskStatus(@PathVariableString taskId){
return taskService.getStatus(taskId);
}

6.4 資源密集型業(yè)務(wù)

為什么能異步:

  • 避免資源爭用:將CPU/IO密集型操作與主線程隔離
  • 彈性擴展:可以通過專用線程池或工作節(jié)點處理
  • 防止主流程阻塞:長時間運行的任務(wù)不會拖慢核心響應(yīng)

典型場景:

  • 圖像/視頻處理
  • 復(fù)雜計算任務(wù)
  • 大數(shù)據(jù)處理

實現(xiàn)示例:

// 圖片縮略圖生成
@PostMapping("/upload")
publicStringuploadImage(@RequestParamMultipartFile file){
String imageId = storageService.store(file);

// 同步返回ID后異步處理縮略圖
    imageProcessingExecutor.submit(()->{
Thumbnailator.createThumbnail(
            storageService.getPath(imageId),
            storageService.getThumbnailPath(imageId),
200,200
);
});

return imageId;
}

6.5 最終一致的業(yè)務(wù)

為什么能異步:

  • 降低分布式事務(wù)復(fù)雜度:避免同步的分布式事務(wù)
  • 提高可用性:部分服務(wù)不可用時仍可繼續(xù)處理
  • 通過重試保證最終成功:失敗操作可以自動重試

典型場景:

  • 跨服務(wù)數(shù)據(jù)同步
  • 支付后的積分發(fā)放
  • 訂單完成后的庫存結(jié)算

實現(xiàn)示例:

// 訂單支付后的積分處理
@TransactionalEventListener(phase =AFTER_COMMIT)
publicvoidhandleOrderPaidEvent(OrderPaidEvent event){
try{
// 異步增加用戶積分(可能失敗)
        pointService.addPoints(
            event.getUserId(),
            event.getAmount()/100,
"訂單獎勵");
}catch(Exception e){
// 失敗后進入重試隊列
        retryQueue.push(newRetryTask(
()-> pointService.addPoints(...),
3// 最大重試次數(shù)
));
}
}

6.6. 典型適用場景示例

6.6.1 用戶行為日志記錄

同步實現(xiàn)問題

@PostMapping("/login")
publicResultlogin(@RequestBodyLoginDTO dto){
// 核心登錄邏輯
User user = authService.authenticate(dto);

// 同步記錄日志(阻塞主流程)
    logService.saveLoginLog(user.getId());

returnResult.success(user);
}

異步優(yōu)化方案

@PostMapping("/login")
publicResultlogin(@RequestBodyLoginDTO dto){
User user = authService.authenticate(dto);

// 異步記錄日志
    eventPublisher.publishEvent(newUserLoginEvent(user.getId()));

returnResult.success(user);
}

@Async
@EventListener
publicvoidhandleLoginEvent(UserLoginEvent event){
    logService.saveLoginLog(event.getUserId());
}

6.6.2 訂單狀態(tài)流轉(zhuǎn)

同步實現(xiàn)問題

@Transactional
publicvoidcancelOrder(String orderId){
// 1. 更新訂單狀態(tài)
    orderDao.updateStatus(orderId,OrderStatus.CANCELLED);

// 2. 釋放庫存(同步調(diào)用)
    inventoryService.unlockStock(orderId);

// 3. 退款處理(同步調(diào)用)
    paymentService.refund(orderId);

// 4. 通知用戶
    notificationService.sendCancelNotice(orderId);
}

異步優(yōu)化方案

@Transactional
publicvoidcancelOrder(String orderId){
// 1. 只處理核心狀態(tài)變更
    orderDao.updateStatus(orderId,OrderStatus.CANCELLED);

// 2. 發(fā)送領(lǐng)域事件
    eventPublisher.publishEvent(newOrderCancelledEvent(orderId));
}

// 各處理步驟異步化
@TransactionalEventListener(phase =AFTER_COMMIT)
publicvoidhandleOrderCancelled(OrderCancelledEvent event){
// 異步釋放庫存
    inventoryService.asyncUnlockStock(event.getOrderId());

// 異步退款
    paymentService.asyncRefund(event.getOrderId());

// 異步通知
    notificationService.asyncSendCancelNotice(event.getOrderId());
}

6.7 異步處理的優(yōu)勢矩陣

業(yè)務(wù)特征

異步優(yōu)勢

技術(shù)實現(xiàn)方案

非核心路徑

保障核心業(yè)務(wù)穩(wěn)定性

線程池隔離(@Async)

允許延遲

提高系統(tǒng)吞吐量

延遲隊列(RabbitMQ TTL+DLX)

無需即時反饋

改善用戶體驗

輪詢機制+任務(wù)隊列

資源密集型

避免主流程阻塞

專用線程池/工作節(jié)點

最終一致

簡化分布式系統(tǒng)架構(gòu)

事件溯源(Event Sourcing)+重試機制

通過理解這些底層原因,開發(fā)者可以更準確地判斷何時應(yīng)該采用異步處理,以及選擇最適合的異步實現(xiàn)方式。異步處理本質(zhì)上是通過空間換時間(更多線程/節(jié)點)和時間換可靠性(重試/持久化)來提升系統(tǒng)整體效能的設(shè)計哲學(xué)。

七、異步處理決策矩陣

業(yè)務(wù)特征

推薦處理方式

技術(shù)方案

注意事項

高頻低耗時

線程池異步

@Async + ThreadPoolTaskExecutor

注意線程池配置

跨服務(wù)解耦

消息隊列

RabbitMQ/Kafka

保證消息可靠性

應(yīng)用內(nèi)模塊解耦

事件驅(qū)動

Spring Events

注意事件監(jiān)聽順序

高并發(fā)IO密集型

反應(yīng)式編程

WebFlux/RxJava

學(xué)習(xí)曲線較陡

長耗時任務(wù)

任務(wù)隊列

Redis Queue + Worker

實現(xiàn)進度跟蹤

實時性要求高

同步處理

傳統(tǒng)Servlet模型

優(yōu)化數(shù)據(jù)庫訪問

八、異步處理的底層原理

  • 線程/協(xié)程切換:將任務(wù)交給其他執(zhí)行單元,釋放主線程
// Java線程池任務(wù)提交
executor.submit(()->{
// 在另一個線程執(zhí)行
});
  • 事件循環(huán)機制:非阻塞IO處理(如Netty)
channel.eventLoop().execute(()->{
// 在IO線程執(zhí)行
});
  • 消息持久化:通過消息隊列保證任務(wù)不丟失
// RabbitMQ消息發(fā)送
rabbitTemplate.convertAndSend(
"exchange",
"routingKey",
    message);
  • 回調(diào)機制:任務(wù)完成后通知
CompletableFuture.supplyAsync(()->{
returnlongTimeOperation();
}).thenAccept(result ->{
// 完成后處理
});

九、異步處理落地經(jīng)驗

  1. 明確邊界
  • 核心業(yè)務(wù)流程保持同步
  • 周邊服務(wù)異步化
  1. 異常處理
@Async
publicvoidasyncTask(){
try{
// 業(yè)務(wù)邏輯
}catch(Exception e){
// 1. 記錄詳細日志
        log.error("Async task failed", e);

// 2. 重試機制
        retryTemplate.execute(ctx ->{
returndoBusiness();
});

// 3. 死信隊列處理
        deadLetterQueue.send(failedMessage);
}
}
  • 監(jiān)控指標
@Bean
publicMeterRegistryCustomizer<MeterRegistry>asyncMetrics(){
return registry ->{
newThreadPoolMetrics(
            asyncExecutor,
"app.async.pool",
Tags.empty()
).bindTo(registry);
};
}
  • 上下文傳遞
@Configuration
publicclassAsyncConfigimplementsAsyncConfigurer{

@Override
publicExecutorgetAsyncExecutor(){
// 支持MDC上下文傳遞
returnnewMdcThreadPoolTaskExecutor();
}
}

通過合理運用異步處理技術(shù),可以使系統(tǒng)獲得:

  • 吞吐量提升5-10倍
  • 響應(yīng)時間降低60%以上
  • 資源利用率提高3倍
  • 更好的故障隔離能力

十、其他適合異步處理的場景

10.1 系統(tǒng)維護類任務(wù)

10.1.1 數(shù)據(jù)備份與歸檔

適合原因

  • 通常在后半夜執(zhí)行,不影響白天業(yè)務(wù)
  • 數(shù)據(jù)量大,耗時長
  • 不需要即時結(jié)果反饋
@Scheduled(cron ="0 0 2 * * ?")// 每天凌晨2點
@Async
publicvoidasyncDatabaseBackup(){
    backupService.performIncrementalBackup();
    auditService.logBackupOperation();
    cleanupService.removeOldBackups();
}

10.1.2 緩存預(yù)熱

適合原因

  • 可以在系統(tǒng)低峰期預(yù)先執(zhí)行
  • 避免首次請求的延遲
  • 失敗不影響核心功能
@PostConstruct
@Async
publicvoidwarmUpCaches(){
    hotProductService.preloadTop100Products();
    categoryTreeCache.rebuild();
    recommendationModel.refresh();
}

10.2用戶體驗優(yōu)化類

10.2.1 預(yù)加載與預(yù)計算

適合原因

  • 預(yù)測用戶可能需要的資源提前加載
  • 計算過程對用戶透明
  • 即使失敗也不影響當前操作
@GetMapping("/product/{id}")
publicProductgetProduct(@PathVariableString id){
Product product = productService.getById(id);

// 異步預(yù)加載關(guān)聯(lián)商品
CompletableFuture.runAsync(()->{
        relatedProductService.preloadFor(product);
}, ioExecutor);

return product;
}

10.2.2 漸進式頁面渲染

適合原因

  • 優(yōu)先返回核心內(nèi)容
  • 次要內(nèi)容后續(xù)異步加載
  • 提升用戶感知速度
@GetMapping("/dashboard")
publicCompletableFuture<Dashboard>getDashboard(){
CompletableFuture<UserProfile> profileFuture = userService.getProfileAsync();
CompletableFuture<List<Notification>> noticesFuture = noticeService.getLatestAsync();

returnCompletableFuture.allOf(profileFuture, noticesFuture)
.thenApply(ignored ->{
Dashboard dashboard =newDashboard();
            dashboard.setProfile(profileFuture.join());
            dashboard.setNotices(noticesFuture.join());
return dashboard;
});
}

10.3 基礎(chǔ)設(shè)施類操作

10.3.1 服務(wù)健康檢查

適合原因

  • 定期后臺執(zhí)行
  • 失敗只需記錄告警
  • 不需要阻塞主流程
@Scheduled(fixedRate =300_000)
@Async("healthCheckExecutor")
publicvoidperformHealthChecks(){
    serviceRegistry.listAllServices()
.parallelStream()
.forEach(service ->{
HealthStatus status = healthChecker.check(service);
            healthDashboard.update(status);
});
}

10.3.2 配置動態(tài)刷新

適合原因

  • 可以分批逐步更新
  • 允許重試機制
  • 新舊配置可短暫共存
@EventListener(ConfigUpdateEvent.class)
@Async
publicvoidhandleConfigUpdate(ConfigUpdateEvent event){
    configManager.reload(event.getKeys())
.retryWhen(Retry.backoff(3,Duration.ofSeconds(1)))
.subscribe();
}

10.4 數(shù)據(jù)處理類任務(wù)

10.4.1 數(shù)據(jù)ETL(抽取-轉(zhuǎn)換-加載)

適合原因

  • 處理流程可分階段異步執(zhí)行
  • 單個步驟失敗可重試
  • 最終結(jié)果一致即可
publicvoidstartEtlJob(JobConfig config){
extractData(config)
.thenApplyAsync(this::transformData, transformPool)
.thenAcceptAsync(this::loadData, loadPool)
.exceptionally(e ->{
            jobMonitor.recordFailure(e);
returnnull;
});
}

10.4.2 機器學(xué)習(xí)模型訓(xùn)練

適合原因

  • 訓(xùn)練過程耗時極長
  • 可以容忍訓(xùn)練延遲
  • 支持訓(xùn)練中途停止/繼續(xù)
@PostMapping("/models")
publicResponseEntity<String>trainModel(@RequestBodyTrainingSpec spec){
String jobId = modelService.submitTrainingJob(spec);
returnResponseEntity.accepted()
.header("Location","/jobs/"+jobId)
.body(jobId);
}

10.5 網(wǎng)絡(luò)通信類

10.5.1 第三方API調(diào)用

適合原因

  • 網(wǎng)絡(luò)延遲不可控
  • 第三方服務(wù)可能不穩(wěn)定
  • 通常不需要即時響應(yīng)
@Async
publicCompletableFuture<ThirdPartyResponse>callExternalApi(ApiRequest request){
return restTemplate.exchangeAsync(request.toUri(),
            request.getMethod(),
            request.getEntity(),
            request.getResponseType());
}

10.5.2 WebSocket消息廣播

適合原因

  • 客戶端接收能力不同
  • 允許消息延遲
  • 支持消息重傳
@Async
publicvoidbroadcastChatMessage(ChatMessage message){
Set<WebSocketSession> sessions = chatRoom.getSessions(message.getRoomId());
    sessions.forEach(session ->{
if(session.isOpen()){
            session.sendAsync(message.toText());
}
});
}

10.6 特殊業(yè)務(wù)場景

10.6.1 預(yù)約排隊系統(tǒng)

適合原因

  • 排隊過程可以后臺處理
  • 結(jié)果可以通過推送通知
  • 支持排隊狀態(tài)查詢
@PostMapping("/reservations")
publicStringcreateReservation(@RequestBodyReservationRequest request){
String queueId = queueService.enqueue(request);

    reservationProcessor.processAsync(queueId)
.thenAccept(result ->{
            notificationService.sendReservationResult(
                request.getUserId(),
                result);
});

return queueId;
}

10.6.2 物聯(lián)網(wǎng)設(shè)備指令

適合原因

  • 設(shè)備響應(yīng)時間不確定
  • 支持指令重試
  • 結(jié)果可以異步回調(diào)
publicvoidsendDeviceCommand(DeviceCommand command){
    commandQueue.publish(command);

// 異步等待響應(yīng)
    deviceResponseSubscriber.waitForResponse(command.getId())
.orTimeout(30,TimeUnit.SECONDS)
.thenAccept(this::handleResponse);
}


責任編輯:武曉燕 來源: Solomon肖哥彈架構(gòu)
相關(guān)推薦

2024-01-31 08:26:44

2023-08-31 16:47:05

反應(yīng)式編程數(shù)據(jù)流

2022-08-15 09:00:00

JavaScript前端架構(gòu)

2021-12-05 23:37:21

Java9異步編程

2019-12-25 09:49:12

WebKitWindowsChrome

2025-02-26 03:00:00

2018-03-01 10:03:37

服務(wù)器架構(gòu)高并發(fā)

2025-03-04 00:30:00

2025-03-03 08:00:00

C#機制內(nèi)存

2025-03-03 08:35:00

單線程C#開發(fā)

2024-11-07 12:31:29

2024-06-13 08:24:43

SpringGateway線程池

2013-07-17 17:03:23

Ngx_luaNginx

2025-06-26 02:11:00

2024-12-26 09:15:28

2023-04-09 16:34:49

JavaSemaphore開發(fā)

2025-01-03 16:32:13

SpringBoot虛擬線程Java

2023-12-26 08:15:11

反應(yīng)式遠程接口

2023-11-07 10:01:34

2019-10-30 16:54:08

golangredis數(shù)據(jù)庫
點贊
收藏

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