内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

讓API并行調(diào)用的方法是什么

本篇內(nèi)容介紹了“讓API并行調(diào)用的方法是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司是一家專業(yè)從事成都網(wǎng)站設計、成都網(wǎng)站制作的網(wǎng)絡公司。作為專業(yè)網(wǎng)站設計公司,成都創(chuàng)新互聯(lián)公司依托的技術(shù)實力、以及多年的網(wǎng)站運營經(jīng)驗,為您提供專業(yè)的成都網(wǎng)站建設、全網(wǎng)營銷推廣及網(wǎng)站設計開發(fā)服務!

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

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

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

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

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

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

當然我們也可以用并行流來實現(xiàn)并發(fā)調(diào)用,代碼如下:

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

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

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

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 來實現(xiàn)異步并發(fā)調(diào)用,直接用原生的 CompletableFuture  也可以,但是編排能力沒有那么強,這里我們選擇一款基于 CompletableFuture  封裝的并行編排框來實現(xiàn)。

稍微做了下封裝,提供了更方便使用的工具類來實現(xiàn)并發(fā)調(diào)用多個接口的邏輯。

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

內(nèi)部是多線程并發(fā)調(diào)用,會等到結(jié)果全部返回。

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 聚合的場景,需要并行調(diào)用多個接口,將結(jié)果進行組裝。

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 中定義參數(shù)和響應的類型,響應結(jié)果會在執(zhí)行完后會自動設置到 AsyncCall 中。在 call 方法中需要根據(jù) taskId  去做對應的處理邏輯,不同的 taskId 調(diào)用的接口不一樣。

“讓API并行調(diào)用的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

文章名稱:讓API并行調(diào)用的方法是什么
文章來源:http://www.rwnh.cn/article12/jsdddc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、App開發(fā)網(wǎng)站策劃、網(wǎng)站排名、網(wǎng)站收錄、營銷型網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
明溪县| 文化| 藁城市| 桂平市| 韩城市| 呼伦贝尔市| 芜湖县| 孟连| 景洪市| 龙南县| 汉阴县| 天镇县| 甘谷县| 同仁县| 苍山县| 海门市| 乐都县| 凤山县| 郧西县| 炉霍县| 达孜县| 武鸣县| 虎林市| 莱芜市| 扬州市| 禄丰县| 独山县| 郴州市| 高雄县| 水富县| 定日县| 敦化市| 五峰| 静安区| 富蕴县| 石柱| 马鞍山市| 凤山县| 浦东新区| 高要市| 汾西县|