国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

讓API并行調用變得如絲般順滑的絕招

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

[[360995]]

本文轉載自微信公眾號「猿天地」,作者尹吉歡。轉載本文請聯系猿天地公眾號。  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. public Object aggregationApi() { 
  2.     long s = System.currentTimeMillis(); 
  3.     List<String> ids = new ArrayList<>(); 
  4.     ids.add("1"); 
  5.     ids.add("2"); 
  6.     ids.add("3"); 
  7.     Map<String, UserResponse> callResult = AsyncTemplate.call(ids, id -> { 
  8.         return userService.getUser(id); 
  9.     }, u -> u.getId(), COMMON_POOL); 
  10.     long e = System.currentTimeMillis(); 
  11.     System.out.println("耗時:" + (e-s) + "ms"); 
  12.     return ""

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

  1. List<AsyncCall> params = new ArrayList<>(); 
  2. AsyncCall<IntegerInteger> goodsQuery = new AsyncCall("goodsQuery", 1); 
  3. params.add(goodsQuery); 
  4. AsyncCall<String, OrderResponse> orderQuery = new AsyncCall("orderQuery""100"); 
  5. params.add(orderQuery); 
  6. UserQuery q = new UserQuery(); 
  7. q.setAge(18); 
  8. q.setName("yinjihuan"); 
  9. AsyncCall<UserQuery, UserResponse> userQuery = new AsyncCall("userQuery", q); 
  10. params.add(userQuery); 
  11. AsyncTemplate.call(params, p -> { 
  12.     if (p.getTaskId().equals("goodsQuery")) { 
  13.         AsyncCall<IntegerInteger> query = p; 
  14.         return goodsService.getGoodsName(query.getParam()); 
  15.     } 
  16.     if (p.getTaskId().equals("orderQuery")) { 
  17.         AsyncCall<String, OrderResponse> query = p; 
  18.         return orderService.getOrder(query.getParam()); 
  19.     } 
  20.     if (p.getTaskId().equals("userQuery")) { 
  21.         AsyncCall<UserQuery, UserResponse> query = p; 
  22.         return userService.getUser(query.getParam()); 
  23.     } 
  24.     return null
  25. }); 

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

源碼參考:https://github.com/yinjihuan/kitty

關于作者:尹吉歡,簡單的技術愛好者,《Spring Cloud 微服務-全棧技術與案例解析》, 《Spring Cloud 微服務 入門 實戰與進階》作者, 公眾號 猿天地 發起人。

原文鏈接:http://cxytiandi.com/blog/user/1

 

責任編輯:武曉燕 來源: 猿天地
相關推薦

2017-06-05 10:01:24

互聯網

2019-04-04 17:15:13

2010-08-06 17:09:14

加薪

2017-10-31 13:20:00

H5翻頁庫框架

2022-05-31 09:01:13

GitHub工具安全

2010-09-01 20:30:14

虛擬園區網網絡架構H3C

2015-10-28 14:03:32

數據遷移數據

2025-02-19 13:00:00

移動端觸摸事件響應速度JavaScrip

2021-06-07 17:46:31

Python 3.8Python編程語言

2021-08-16 12:13:02

SwiftUIList ArticleList

2010-09-15 21:14:48

IT管理網絡構架Juniper Net

2009-04-16 09:13:09

PHP代碼優化提速

2011-06-21 15:42:32

筆記本技巧

2022-10-10 09:41:54

LinuxWindowsWSL2

2020-07-20 10:40:52

Linux命令Ubuntu

2022-03-04 20:28:02

VueReact網頁

2022-10-26 10:24:21

2023-07-06 10:45:03

CIO領導力

2024-11-18 08:33:56

2015-12-02 09:37:24

數據中心數據中心優化
點贊
收藏

51CTO技術棧公眾號

欧美卡一卡二| 久久精品人人爽| 91老司机精品视频| 高清成人在线| 国产精品久久久久婷婷| 中文字幕亚洲无线码在线一区| 亚洲精品一区二| 男人亚洲天堂| 久久夜色精品国产欧美乱极品| 亚洲人成五月天| 国产二区视频在线播放| 日韩欧美中文字幕一区二区三区| 一区二区在线电影| 性欧美大战久久久久久久免费观看 | 在线观看成年人视频| 日本成人中文字幕| 欧美不卡在线一区二区三区| av毛片午夜不卡高**水| 95精品视频在线| 午夜精品美女久久久久av福利| 91嫩草亚洲精品| 亚洲第一网站免费视频| 成人av在线不卡| 亚洲影院理伦片| 午夜视频在线观看一区二区三区| 国产精品18久久久久久久久久久久| 国产精品欧美久久久久一区二区| 久久久噜噜噜久久中文字免| 亚洲3区在线| 欧美一级bbbbb性bbbb喷潮片| 国产成人一区二区三区影院| 国产中文欧美精品| 日韩精品成人一区二区三区| 免费成人进口网站| 国产欧美视频一区二区| 中文字幕第21页| 色老综合老女人久久久| gogo在线观看| 久久韩国免费视频| 亚洲自拍偷拍网| 欧美少妇在线观看| 岛国av在线不卡| 欧洲亚洲两性| 国产精品视频自在线| 久久三级福利| 五月婷婷开心综合| 日韩一二在线观看| 国产精品tv| 欧美美女黄色网| 欧美日韩免费观看中文| 久草在线视频网站| 久久成人人人人精品欧| 91丨精品丨国产| 久草精品电影| 一区二区三区美女视频| av影院在线| 国产在线一区二区三区欧美| www.欧美日韩| 都市激情亚洲综合| 91精品中文在线| 国产三级精品三级在线专区| 国产后进白嫩翘臀在线观看视频| 亚洲品质视频自拍网| 亚洲国产免费| 成人a视频在线| 精品国产一区二区三区不卡| 婷婷色综合网| 欧美xx网站| 亚洲色图35p| 欧美午夜一区| 亚洲人成77777男人| 久久精品91久久久久久再现| 亚洲高清成人| 欧美日韩在线看片| 久久精品国产理论片免费| 亚洲视频综合在线| 女人抽搐喷水高潮国产精品| 精品999在线| 日韩av不卡电影| 亚洲福利电影网| 91影院成人| 国产98在线| 精品久久一区二区三区蜜桃| 91黄色激情网站| 久久精选视频| av资源中文在线| 五十路熟女丰满大屁股| 亚洲最新av网址| 久久免费的精品国产v∧| 国产美女视频一区二区| 亚洲精品成人久久久998| 亚洲图片制服诱惑| 久久久精品免费免费| 精品无人区一区二区| 在线看国产视频| 96成人在线视频| 日韩电影大片中文字幕| 26uuu亚洲婷婷狠狠天堂| 97久久中文字幕| 久久久久久久久久久久久国产精品| 热久久美女精品天天吊色| 91精品国产综合久久久蜜臀图片| 懂色av一区二区在线播放| 91成人福利| 在线观看二区| 我要看一级黄色大片| 成人高清在线观看| 亚洲福利精品在线| 亚洲乱码国产乱码精品精的特点| 欧美涩涩网站| 一区二区三区免费在线看| 色综合久久影院| 成人三级av| www国产免费| 国产精品美女诱惑| 久久97久久97精品免视看| 欧美片网站yy| 亚洲电影一区二区| 91女厕偷拍女厕偷拍高清| 亚洲女同同性videoxma| 4438x成人网全国最大| 能在线观看av网站| 成人一级片网站| 亚洲国产成人不卡| 国产欧美精品一区二区| 亚洲欧美国产高清va在线播| 亚洲精品中文字幕在线观看| 成人成人成人在线视频| 国产一区二区精品在线观看| 伊人色**天天综合婷婷| 九九精品在线| 丁香五月缴情综合网| 国产在视频一区二区三区吞精| 欧洲中文在线| 国产午夜电影| 亚洲无吗一区二区三区| 国产精品啪视频| 久久久久国产视频| 国内自拍欧美激情| 欧美成人在线影院| 久久这里有精品视频| 久久九九全国免费精品观看| 日韩在线中文字| 日韩视频永久免费观看| 日韩欧美国产三级| 国产日韩三级在线| 日韩高清在线观看| 日韩不卡免费视频| 精品在线一区二区三区| 日本成人在线视频网站| 国产乱码精品一区二区三区五月婷| 国产伦精品一区二区三区免费迷| 成人h动漫精品| proumb性欧美在线观看| 亚洲激情欧美激情| 欧美性生交大片免网| 日韩亚洲欧美中文三级| 伊人久久综合97精品| 亚洲国产精品久久久久| 精品国偷自产在线视频99| 国产亚洲视频在线| 日韩一级大片在线| 亚洲日本欧美日韩高观看| 97在线视频国产| 欧美三级电影在线播放| 天堂…中文在线最新版在线| 在线免费观看你懂的| 国产黄色免费在线观看| 欧美亚洲黄色| 久久激情中文| 亚洲资源在线观看| 日韩一级欧美一级| 青青草原成人在线视频| 51国产成人精品午夜福中文下载 | 色哟哟一区二区在线观看| 亚洲激情 国产| 97视频网站入口| 91嫩草国产丨精品入口麻豆| 国产又大又黄又猛| 蜜桃视频m3u8在线观看| 天天影视天天精品| 成人午夜视频在线| 8v天堂国产在线一区二区| 2025国产精品视频| 91av资源网| av电影免费在线看| 精品欧美激情在线观看| 成人性色生活片| 日韩精品一区国产麻豆| 欧美性受xxxx黑人猛交| 国产免费黄视频| 亚洲综合电影| 久久精品观看| 日韩视频免费直播| 精品久久久久久乱码天堂| 日韩偷拍自拍| 999国产精品999久久久久久| 中文字幕日韩欧美一区二区三区| 欧美激情久久久久久| 一女被多男玩喷潮视频|