久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

讓API并行調用的方法是什么

177次閱讀
沒有評論

共計 3134 個字符,預計需要花費 8 分鐘才能閱讀完成。

本篇內容介紹了“讓 API 并行調用的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

當數據量較大的時候,都會通過分庫分表來拆分,分擔讀寫的壓力。分庫分表后比較麻煩的就是查詢的問題,如果不是直接根據分片鍵去查詢的話,需要對多個表進行查詢。

在一些復雜的業務場景下,比如訂單搜索,除了訂單號,用戶,商家 這些常用的搜索條件,可能還有時間,商品等等。

目前常見的做法將數據同步到 ES 這類搜索框架中進行查詢,然后通過搜出來的結果,一般是主鍵 ID,   再去具體的數據表中查詢完整的數據,組裝返回給調用方。

比如下面這段代碼,首先查詢出文章信息,然后根據文章中的用戶 ID 去查詢用戶的昵稱。

List ArticleBO  articleBos = articleDoPage.getRecords().stream().map(r -  { String nickname = userManager.getNickname(r.getUserId()); return articleBoConvert.convertPlus(r, nickname); }).collect(Collectors.toList());

如果文章有 10 條數據,那么就需要調用 10 次用戶服務提供的接口,而且是同步調用操作。

當然我們也可以用并行流來實現并發調用,代碼如下:

List ArticleBO  articleBos = articleDoPage.getRecords().parallelStream().map(r -  { String nickname = userManager.getNickname(r.getUserId()); return articleBoConvert.convertPlus(r, nickname); }).collect(Collectors.toList());

并行流的優點很明顯,代碼不用做特別大的改動。需要注意如果用并行流,最好單獨定義一個 ForkJoinPool。

除了用并行流,還可以使用批量查詢的方式來提高性能,降低 RPC 的調用次數,代碼如下:

List Long  userIds = articleDoPage.getRecords().stream().map(article -  article.getUserId()).collect(Collectors.toList()); Map Long, String  nickNameMap = userManager.queryByIds(userIds).stream().collect(Collectors.toMap(UserResponse::getId, UserResponse::getNickname)); List ArticleBO  articleBos = articleDoPage.getRecords().stream().map(r -  { String nickname = nickNameMap.containsKey(r.getUserId()) ? nickNameMap.get(r.getUserId()) : CommonConstant.DEFAULT_EMPTY_STR; return articleBoConvert.convertPlus(r, nickname); }).collect(Collectors.toList());

但批量查詢還是同步模式,下面介紹如果使用 CompletableFuture 來實現異步并發調用,直接用原生的 CompletableFuture   也可以,但是編排能力沒有那么強,這里我們選擇一款基于 CompletableFuture   封裝的并行編排框來實現。

稍微做了下封裝,提供了更方便使用的工具類來實現并發調用多個接口的邏輯。

第一種方式,適用于比如從 ES 查出了一批 ID, 然后根據 ID 去數據庫中或者調用 RPC 查詢真實數據,最后得到一個 Map,可以根據 Key   獲取對應的數據。

內部是多線程并發調用,會等到結果全部返回。

public Object aggregationApi() { long s = System.currentTimeMillis(); List String  ids = new ArrayList (); ids.add( 1  ids.add( 2  ids.add( 3  Map String, UserResponse  callResult = AsyncTemplate.call(ids, id -  { return userService.getUser(id); }, u -  u.getId(), COMMON_POOL); long e = System.currentTimeMillis(); System.out.println( 耗時: + (e-s) +  ms  return   }

另一個場景就是 API 聚合的場景,需要并行調用多個接口,將結果進行組裝。

List AsyncCall  params = new ArrayList (); AsyncCall Integer, Integer  goodsQuery = new AsyncCall( goodsQuery , 1); params.add(goodsQuery); AsyncCall String, OrderResponse  orderQuery = new AsyncCall(orderQuery ,  100  params.add(orderQuery); UserQuery q = new UserQuery(); q.setAge(18); q.setName(yinjihuan  AsyncCall UserQuery, UserResponse  userQuery = new AsyncCall( userQuery , q); params.add(userQuery); AsyncTemplate.call(params, p -  { if (p.getTaskId().equals(goodsQuery)) { AsyncCall Integer, Integer  query = p; return goodsService.getGoodsName(query.getParam()); } if (p.getTaskId().equals(orderQuery)) { AsyncCall String, OrderResponse  query = p; return orderService.getOrder(query.getParam()); } if (p.getTaskId().equals(userQuery)) { AsyncCall UserQuery, UserResponse  query = p; return userService.getUser(query.getParam()); } return null; });

AsyncCall 中定義參數和響應的類型,響應結果會在執行完后會自動設置到 AsyncCall 中。在 call 方法中需要根據 taskId   去做對應的處理邏輯,不同的 taskId 調用的接口不一樣。

“讓 API 并行調用的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-27發表,共計3134字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 清河县| 定陶县| 东辽县| 河曲县| 清涧县| 广平县| 石泉县| 麟游县| 泰和县| 时尚| 浦江县| 林口县| 阳谷县| 陇南市| 格尔木市| 洞头县| 台安县| 天祝| 沙坪坝区| 祁连县| 谢通门县| 玉龙| 唐山市| 诏安县| 贵定县| 东台市| 资溪县| 龙川县| 葵青区| 大同市| 阳曲县| 库伦旗| 沾化县| 邯郸市| 台中市| 拜泉县| 武胜县| 黎平县| 呼伦贝尔市| 衡东县| 张家口市|