springboot 高併發下耗時操作的實現

2022-02-18 09:54:40 字數 1164 閱讀 1439

官方文件中說deferredresult和callable都是為了非同步生成返回值提供基本的支援。簡單來說就是乙個請求進來,如果你使用了deferredresult或者callable,在沒有得到返回資料之前,dispatcherservlet和所有filter就會退出servlet容器執行緒,但響應保持開啟狀態,一旦返回資料有了,這個dispatcherservlet就會被再次呼叫並且處理,以非同步產生的方式,向請求端返回值。

這麼做的好處就是請求不會長時間占用服務連線池,提高伺服器的吞吐量。

高併發下,就是請求在乙個時間點比較多時,很多寫的請求打過來時,你的伺服器承受很大的壓力,當你的乙個請求處理時間長時,這些請求將會把你的伺服器執行緒耗盡,即你的主線程池裡的執行緒將不會再有空閒狀態的,再打過來的請求,將會是502了。

thread1 thread2 thread3使用deferredresult來實現非同步的操作,當乙個請求打過來時,先把它放到乙個佇列時,然後在後台有乙個訂閱者,有相關主題的訊息發過來時,這個訂閱者就去消費它,這一步可以是分布式的,比如乙個秒殺場景,當n多的請求打過來時,有一些請求命中後,它們進行寫操作,這時寫操作壓力很大,1個請求可以要處理3秒,對於高併發場景這是不能容許的,因為你這樣占用的伺服器執行緒資源太長了,很快你的伺服器就沒有可用的執行緒資源了,這時就可以用到deferredresult這處理。

建立訂單的介面,只負責簡單的校驗和事件的發布

/**

* 非同步建立高併發的訂單.

** @return

*/public deferredresultcreateorder()

非同步的訂單處理核心邏輯,也是耗時的操作

@component

@enableasync

public class orderlistener

}

當請求/create-order後,伺服器在處理2秒後,返回結果,而spring後台真正做的是,執行緒1在事件發布後,它成為空閒狀態,其它請求可以復用它,當processorder後台處理結果後,spring又會用執行緒池中拿乙個新的執行緒處理剩下的邏輯!

springboot下redis高併發下的快取穿透

public responsebody string getclassesbyid pathvariable id integer id return redistemplate.opsforvalue get classes 從redis中拿 這樣看單機條件下沒有問題但是高併發下還是會存在多個使用...

springboot 高併發下耗時操作的實現

高併發下,就是請求在乙個時間點比較多時,很多寫的請求打過來時,你的伺服器承受很大的壓力,當你的乙個請求處理時間長時,這些請求將會把你的伺服器執行緒耗盡,即你的主線程池裡的執行緒將不會再有空閒狀態的,再打過來的請求,將會是502了。thread1 thread2 thread3使用deferredre...

高併發下搶購

了解高併發以及怎麼處理後,測試一下專案中下單的 邏輯很簡單,goods表中stock設定為unsigned。剛開始你可能會覺得這樣會出現超單的情況,但是測試後,沒有出現超單的情況。看似沒有問題,但是看過日誌發現問題還挺多的。這之前請看下這篇文章裡面有處理高併發下單的情況。goods id num g...