Java架構-異步併發

使用場景

目前的開發方式早已前後端完全分離,使用mvc架構且顯示層使用jsp等技術的公司越來越少,大家都改爲前端使用vue,react等框架技術調用後臺api的方式.這種方式確實對網站的訪問流暢體驗增分不少,但隨着業務的增加,一個性能問題出現了. 頁面的異步請求數量爆發.導致服務器壓力大,解決這個問題並不難,其思路是後端將多個請求進行封裝後一次性返回給前端. 後端需要使用異步併發調用多個服務後進行封裝返回,解決順序調用耗時高的問題.

異步併發處理並不能使響應變得更快,更多是爲了提升吞吐量.異步是提升CPU和io之間的配合,當io沒有就緒時要讓出cpu來處理其他任務.

同步調用

UserService userService = new UserService();
ShopService shopService = new ShopService();
// 耗時10秒
UserInfo _userinfo = userService.getUserInfo();
// 耗時20秒
ShopInfo _shopInfo = shopService.getShopInfo();
// 最終耗時爲30秒

異步 Future

幾個任務就發起幾個線程去做事,最終響應時間爲耗時最多的哪個線程

ExecutorService executor = Executors.new FixedThreadPool(2);
UserService userService = new UserService();
ShopService shopService = new ShopService();
Future<UserInfo> futureUserInfo = executor.submit(()->userService.getUserInfo());
Future<ShopInfo> futureShopInfo = executor.submit(()->shopService.getShopInfo());
// 耗時10秒
UserInfo _userinfo = futureUserInfo.get();
// 耗時20秒
ShopInfo _shopInfo = futureShopInfo.get();
// 最終耗時爲20秒

異步 Callback 和 CompletableFuture

大型系統的拆分一般會將其拆分成相對獨立的服務(系統),比如一個商城系統我們會將其拆分成訂單服務,商品服務,評論服務,權限服務,人員管理服務等.每個服務獨立運行,分佈式部署.
對外僅提供一個接口服務,由該接口服務調用其他內部子服務後將數據整合後返回給客戶端.
這樣就需要我們使用NIO異步模型實現,
HttpAsyncClien配合CompletableFuture就可以很好處理該場景.


場景1:多個服務獲取後進行數據整合

M1Service s1; // 訂單服務
M2Service s2; // 評論服務
M3Service s3; // 商品服務
CompletableFuture<String> f1 = s1.getData("http://www.abc.com/eee/data123.do");
CompletableFuture<String> f2 = s2.getData("http://www.abc.com/eee/data123.do");
CompletableFuture<String> f3 = s3.getData("http://www.abc.com/eee/data123.do");
CompletableFuture.allOf(f1,f2,f3).thenApplyAsync(()->{
    // 三個服務數據的返回整合
});

場景2: 評價服務和商品服務需要依賴訂單服務的數據

M1Service s1; // 訂單服務
M2Service s2; // 評論服務
M3Service s3; // 商品服務
CompletableFuture<String> f1 = s1.getData("http://www.abc.com/eee/data123.do");
CompletableFuture<String> f2 = 
f1.thenApplyAsync((v)->{
    return "service2 data";
});
CompletableFuture<String> f3 = s3.getData("http://www.abc.com/eee/data123.do");
f2.thenCombineAsync(f3,(r2,r3)->{
   // 服務數據的返回整合
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章