Java多線程異步調(diào)用性能調(diào)優(yōu)方法詳解
概述
大型電商公司的支付聚合服務(wù)都有這類的場景:
- 調(diào)用校驗服務(wù)校驗待生成的訂單是否合法
- 訂單服務(wù)生成訂單(校驗服務(wù)和訂單服務(wù)沒有依賴關(guān)系)
- 調(diào)用1和2,支付服務(wù)實現(xiàn)支付核心的功能
- 結(jié)合步驟1至3完成支付服務(wù)的聚合調(diào)用
?假如步驟1的耗時5秒,步驟2的耗時3秒,步驟3的耗時2秒,如果你是架構(gòu)師,要求:?
1.請實現(xiàn)微服務(wù)的同步調(diào)用
2.請實現(xiàn)微服務(wù)的異步調(diào)用(使用CompletableFuture實現(xiàn))
比較1和2的性能.?
同步調(diào)用和異步調(diào)用
Future類圖
Future的不足
Future直接表述多個Future結(jié)果之間的依賴性,有一定的缺陷:
1.將兩個異步計算合并為一個(第二個異步計算依賴于第一個的結(jié)果),這個用Future不太好實現(xiàn).
2.等待Future集合中的所有的任務(wù)都完成
僅等待Future集合中最快結(jié)束的任務(wù)完成,并返回它的結(jié)果
代碼
代碼地址
https://gitee.com/zjvngvn/mutil-thread
Test
public class Test { public static void main(String[] args) { // 同步調(diào)用 long start1 = System.currentTimeMillis(); PaymentService.syncPay(); System.out.println("同步支付耗時:" + (System.currentTimeMillis() - start1)+" ms"); System.out.println("========================="); // 異步調(diào)用 long start2 = System.currentTimeMillis(); PaymentService.asyncPay(); System.out.println("異步支付耗時:" + (System.currentTimeMillis() - start2)+" ms"); } }
PaymentService
import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class PaymentService { /** * 異步支付的入口方法 * * @return */ public static boolean asyncPay() { //校驗 CompletableFuture<Boolean> isValid = CompletableFuture.supplyAsync(() -> CheckService.isValid()); //創(chuàng)建訂單 CompletableFuture<Integer> orderSum = CompletableFuture.supplyAsync(() -> OrderService.createOrder()); //支付 CompletableFuture<Integer> money = CompletableFuture.supplyAsync(() -> basePay()); // 上面三個都完成之后,再進行下面匿名內(nèi)部類的代碼 CompletableFuture.allOf(isValid, orderSum, money) .thenRun(() -> System.out.println("完成異步支付")) .join(); return true; } /** * 同步支付的入口方法 * * @return */ public static boolean syncPay() { CheckService.isValid(); OrderService.createOrder(); basePay(); System.out.println("同步支付成功"); //假設(shè)支付成功 return true; } public static int basePay() { int money = 1000; try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("支付"); //假設(shè)支付成功 return money; } }
CheckService
import java.util.concurrent.TimeUnit; public class CheckService { /** * 返回true說明訂單流程才會往下走 */ public static boolean isValid() { System.out.println("訂單生成前,檢驗訂單是否合法" ); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } //假設(shè)訂單合法,通過校驗 return true; } }
OrderService
import java.util.concurrent.TimeUnit; public class OrderService { public static int createOrder() { int orderSum=1; System.out.println("生成訂單" ); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } //假設(shè)訂單數(shù)量為1 return orderSum; } }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Mybatis-Plus實現(xiàn)自動生成代碼的操作步驟
AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提升了開發(fā)效率,本文將給大家介紹Mybatis-Plus實現(xiàn)自動生成代碼的操作步驟2023-10-10Spring Mvc下實現(xiàn)以文件流方式下載文件的方法示例
這篇文章主要介紹了Spring Mvc下實現(xiàn)以文件流方式下載文件的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05