springBoot 效能優化 非同步響應

2021-08-24 20:16:31 字數 1288 閱讀 5714

業務開發中,有很多場景會有比較耗時的操作

比如需要呼叫第三方介面查詢資料、發郵件等

都有可能需要1秒以上的時間

如果按照傳統的方式處理,即是執行緒阻塞1秒以上的時間去等待結果,再把結果返回給使用者

而且處理請求的執行緒池中線程數總是有限的,如果執行緒都阻塞在等待中,後續的請求只能排隊等候

這也就影響到了伺服器的併發處理能力

為了讓請求的執行緒盡早的釋放出來,就需要使用非同步方式處理耗時的請求

簡單的思路就是當有耗時操作時,讓請求的執行緒先退出,把任務交給另乙個執行緒來處理,

這樣請求的執行緒就可以繼續處理後面的請求,提高了伺服器的併發處理能力

servlet api3.0就增加了非同步處理方法,考慮到使用寫底層servlet的機會比較少,主流的開發還是基於springboot 或springmvc

本文主要解釋一下springboot的非同步處理方法

方法一:webasynctask

建立乙個callable物件,並由新執行緒去執行耗時任務,並由新執行緒返回response給使用者

@restcontroller

public class greetingcontroller catch (interruptedexception e)

return null;}};

system.out.println("請求處理執行緒方法執行完畢時間 : "+system.currenttimemillis()+"秒");

return new webasynctask(callable);

}}

方法二:defferedresult 

建立乙個defferedresult 物件,把這個物件寄存起來,可以建立乙個新執行緒來處理耗時任務,也可以交給其它執行緒處理,比如下面的**,就是交給乙個定時任務來處理,你也可以把這個物件交給佇列的訂閱事件來處理,這樣就是乙個完全不阻塞的流程了。

@restcontroller

public class testdelay

/*** 定時任務

*/@scheduled(fixeddelay = 5000)

public void taskresp() catch (exception e)

});} }

}

由上面兩個例子可以看出:

webasynctask 可以釋放請求的主線程,但還是要另乙個執行緒來阻塞處理

defferedresult 則可以用非阻塞的方法來處理請求

所以在實際場景中,會更多的使用到defferedresult

springboot整合dubbo實現非同步呼叫

二 在consumer端實現 三 結果 與正常dobbu使用一樣,只是設定service屬性async ture service version 1.0 group hehe async true public class userserviceimpl implements userservice...

springboot使用 async實現非同步執行緒池

工作中經常涉及非同步任務,通常是使用多執行緒技術,比如執行緒池threadpoolexecutor,但使用executors容易產生oom,需要手動使用threadpoolexecutor建立執行緒池 在springboot使用 async 可以實現非同步呼叫,配置執行緒池引數,可以簡單的實現多執行...

spring boot 效能監控

廢話不多說,直接上乾貨 spring boot自帶效能監控,需要引入依賴包如下 org.springframework.boot spring boot starter actuator 繼承abstractendpoint類,實現invoke方法,返回需要展示的效能資訊。建構函式必須傳入乙個指定的...