并行API调用的方式是什么?

分类:编程技术 时间:2024-02-20 15:41 浏览:0 评论:0
0
本文介绍了《API并行调用的方法是什么》的相关知识。在实际案例操作过程中,很多人都会遇到这样的困境。接下来就让小编带领大家学习一下如何处理这些问题。情况!我希望你能仔细阅读并学到一些东西!

当数据量较大时,会分库分表,分担读写压力。分库分表后比较麻烦的就是查询问题。如果不是直接根据分片键查询,则需要查询多个表。

在一些复杂的业务场景中,比如订单搜索,这些常见的搜索条件除了订单号、用户、商家之外,还可能包括时间、产品等。

当前常见的做法是将数据同步到ES等搜索框架进行查询,然后利用搜索结果(通常是主键ID)来查询完整的数据n 具体的数据表,组装并返回给调用者。

例如,下面的代码首先查询文章信息,然后根据文章中的用户ID查询用户的昵称。

ListarticleBos =articleDoPage.getRecords().stream().map(r -> { Stringnickname = userManager.getNickname(r.getUserId()); returnarticleBoConvert.convertPlus(r,昵称); }).collect(Collectors.toList());

如果文章有10条数据,那么用户服务提供的接口需要调用10次,调用操作是同步的。

当然我们也可以使用并行流来实现并发调用。代码如下:

ListarticleBos =articleDoPage.getRecords().parallelStream().map(r -> { Stringnickname = userManager.getNickname(r.getUserId()); return ArticleBoConvert.convertPlus(r,nickname); }).collect(Collectors.toList());

并行流的优点很明显,而且t这里不需要对任何代码做很大的改动。需要注意的是,如果使用并行流,最好定义一个单独的ForkJoinPool。

除了使用并行流之外,还可以使用批量查询来提高性能,减少RPC调用次数。代码如下:

List userIds =articleDoPage.getRecords() .stream().map(article ->article.getUserId()).collect(Collectors.toList()); Map nickNameMap = userManager.queryByIds(userIds).stream().collect(Collectors.toMap (UserResponse::getId, UserResponse::getNickname)); ListarticleBos =articleDoPage.getRecords().stream().map(r -> { String 昵称 = nickNameMap.containsKey(r.getUserId()) ? nickNameMap .get(r.getUserId()) : CommonConstant.DEFAULT_EMPTY_STR ; returnarticleBoConvert.convertPlus(r,nickname); }).collect(Collectors.toList());

但是批量查询仍然是同步模式。下面介绍如何使用CompletableFuture来imp元素异步并发调用。您也可以直接使用原生 CompletableFuture。是的,但是编排能力没有那么强。这里我们选择基于CompletableFuture封装的并行编排盒来实现。

稍微封装了一下,提供了更方便的工具类来实现并发调用多个接口的逻辑。

第一种方法适合,比如从ES中找到一批ID,然后根据ID去数据库或者调用RPC查询真实数据,最后得到一个Map,根据Key即可获取对应的数据。

在内部,它由多个线程并发调用,并会等待直到所有结果返回。

public ObjectaggregationApi() { long s = System.currentTimeMillis(); List ids = new ArrayList<>(); ids.add(“1”); ids.add("2"); ids.add("3"); Map callResult = AsyncTemplate.call(ids, id -> { r返回 userService.getUser(id); }, u -> u.getId(), COMMON_POOL); long e = System.currentTimeMillis(); System.out.println("耗时:" + (e-s) + "ms");返回 ” ”; }

另一种场景是API聚合,需要并行调用多个接口来组装结果。

List params = new ArrayList<>(); AsyncCallgoodsQuery = new AsyncCall("goodsQuery", 1); params.add(goodsQuery); AsyncCall orderQuery = new AsyncCall("orderQuery", "100"); params.add(orderQuery); UserQuery q = new UserQuery(); q.setAge(18); q.setName("银吉环"); AsyncCall userQuery = new AsyncCall("userQuery", q); params.add(userQuery); AsyncTemplate.call(params, p -> { if (p.getTaskId().equals("goodsQuery")) { AsyncCall query = p;       returngoodsService.getGoodsName(query.getParam());if (p.der(query.getParam ()); } if (p.getTaskId().equals("userQuery")) { AsyncCall query = p; return userService.getUser(query.getParam() ); return null; });

AsyncCall中定义了参数和响应类型,执行后将显示响应结果。自动设置为 AsyncCall。在call方法中,需要根据taskId来做相应的处理逻辑。不同的taskId调用不同的接口。

这里介绍“API并行调用的方法是什么”。感谢您的阅读。如果您想了解更多行业资讯,可以关注网站,小编将为大家输出更多优质实用文章!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 并行API调用的方式是什么?

用户评论