Springboot:高併發下耗時操作的實現
高併發下的耗時操作
高併發下,就是請求在一個時間點比較多時,很多寫的請求打過來時,你的伺服器承受很大的壓力,當你的一個請求處理時間長時,這些請求將會把你的伺服器執行緒耗盡,即你的主執行緒池裡的執行緒將不會再有空閒狀態的,再打過來的請求,將會是502了。 加 q群:478052716 免費領取(Java架構資料,影片資料,BATJ面試資料)
請求流程圖
http1 http2 http3
thread1 thread2 thread3
解決方案
使用 DeferredResult 來實現非同步的操作,當一個請求打過來時,先把它放到一個佇列時,然後在後臺有一個訂閱者,有相關主題的訊息發過來時,這個訂閱者就去消費它,這一步可以是分散式的,比如一個秒殺場景,當N多的請求打過來時,有一些請求命中後,它們進行寫操作,這時寫操作壓力很大,1個請求可以要處理3秒,對於高併發場景這是不能容許的,因為你這樣佔用的伺服器執行緒資源太長了,很快你的伺服器就沒有可用的執行緒資源了,這時就可以用到DeferredResult這處理。
程式碼實現
建立訂單的介面,只負責簡單的校驗和事件的釋出
/**
* 非同步建立高併發的訂單.
*
* @return
*/
@GetMapping("/create-order")
public DeferredResult<Object> createOrder() {
DeferredResult<Object> deferredResult = new DeferredResult<>((long) 3000, "error order");
logger.info("釋出建立訂單的事件");
applicationEventPublisher.publishEvent(deferredResult);
return deferredResult;
}
非同步的訂單處理核心邏輯,也是耗時的操作
@Component
@EnableAsync
public class OrderListener {
static Logger logger = LoggerFactory.getLogger(OrderListener.class);
/**
* 事實上它是一個訂單佇列的消費者,在後臺寫訂單,本例使用簡單的事件監聽器實現非同步處理的功能.
*
* @return
*/
@EventListener
@Async
public String processOrder(DeferredResult<Object> deferredResult) throws InterruptedException {
logger.info("處理訂單並返回到對應的Http上下文");
String order = UUID.randomUUID().toString();
Thread.sleep(2000);//假設處理資料需要5秒,前端需要阻塞5秒,但http主執行緒已經釋放了,比較適合IO密集型場合
//當設定之後,create-order將成功響應
deferredResult.setResult(order);
return order;
}
}
測試結果
當請求/create-order後,伺服器在處理2秒後,返回結果,而spring後臺真正做的是,執行緒1在事件釋出後,它成為空閒狀態,其它請求可以複用它,當processOrder後臺處理結果後,spring又會用執行緒池中拿一個新的執行緒處理剩下的邏輯!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545684/viewspace-2664530/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis 實現高併發下的搶購 / 秒殺功能Redis
- 資料庫系列:InnoDB下實現高併發控制資料庫
- Nginx 實現高併發的原理分析Nginx
- SpringBoot實現Java高併發秒殺系統之Web層開發(三)Spring BootJavaWeb
- django框架怎麼實現高併發Django框架
- 《高併發下的.NET》第2季 - 故障公告:高併發下全線崩潰
- SpringBoot中併發定時任務的實現、動態定時任務的實現(看這一篇就夠了)Spring Boot
- 使用 Arthas 排查 SpringBoot 詭異耗時的 BugSpring Boot
- 用PHP實現高併發伺服器PHP伺服器
- 如何快速實現高併發短文檢索
- 利用Redis實現高併發計數器Redis
- Go - 使用 sync.WaitGroup 來實現併發操作GoAI
- 高併發系統的限流演算法與實現演算法
- 高併發mysql update操作必定失敗MySql
- java高併發系列 - 第21天:java中的CAS操作,java併發的基石Java
- Java ConcurrentHashMap 高併發安全實現原理解析JavaHashMap
- php利用pcntl擴充套件實現高併發PHP套件
- 非同步任務處理系統,如何解決業務長耗時、高併發難題?非同步
- 高併發場景下JVM調優實踐之路JVM
- PHP下用Swoole實現Actor併發模型PHP模型
- Java使用程式碼模擬高併發操作Java
- 有序列表和集合插入操作的耗時差距
- 【高併發】高併發環境下如何優化Tomcat效能?看完我懂了!優化Tomcat
- 併發場景下資料寫入功能的實現
- Nginx Ingress 高併發實踐Nginx
- 從零開始的高併發(二)--- Zookeeper實現分散式鎖分散式
- 高併發下丟失更新的解決方案
- 如何在耗時較長的操作完成後得到提醒?
- Java高併發實戰,鎖的優化Java優化
- [分散式][高併發]高併發架構分散式架構
- 【高併發】如何實現億級流量下的分散式限流?這些理論你必須掌握!!分散式
- 快速瞭解Python併發程式設計的工程實現(下)Python程式設計
- 【本人禿頂程式設計師】SpringBoot中併發定時任務的實現、動態定時任務的實現(看這一篇就夠了)程式設計師Spring Boot
- 短影片直播系統,實現高併發秒殺的多種方式
- 高併發下的介面冪等性解決方案!
- 高併發下的伺服器架構演變伺服器架構
- 高併發下log4j的效能瓶頸
- 高德APP啟動耗時剖析與優化實踐(iOS篇)APP優化iOS