面试碰到一个问题,搞不定

2020-12-16 22:00:43 +08:00
 luxinfl
比如说要调用 abcde 这五个微服务,调用 b 的前提是先调用 a,cde 没有这种顺序要求。最终数据要求整合。怎么才能让时延变小??
6494 次点击
所在节点    程序员
44 条回复
Yoock
2020-12-16 22:10:13 +08:00
waitgroup
luxinfl
2020-12-16 22:15:02 +08:00
@Yoock 有 java 的实现么
fanyiaa
2020-12-16 22:19:59 +08:00
c#里用 task 很容易。java 不知道有什么简便方法
Cbdy
2020-12-16 22:21:39 +08:00
let resultA
const [resultB, resultC, resultD, resultE] = await Promise.all([a().then(ra => { resultA = ra; return b() }), c(), d(), e()])
Yoock
2020-12-16 22:23:33 +08:00
搜到一个 [CountDownLatch]( https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)
不太了解 Java,你看一下
luxinfl
2020-12-16 22:27:55 +08:00
我想说的不是 AQS 方面的东西。是侧重于 java 微服务相关的
pkwenda
2020-12-16 22:45:45 +08:00
比如 zuul 网关应该可以写 groovy 从注册中心获取微服务,先调用啊,并发调用 cde,代码整合
kong 这种可以写 lua 插件
是这个意思吧,不进行并发处理延时是一样的
网关做 merge
mango88
2020-12-16 23:49:08 +08:00
可以用几个 future,然后用 CompletableFuture.allOf() ,等所有 future 完成再去组装数据
xizismile
2020-12-16 23:51:10 +08:00
去看看 CompletableFuture 类
hangszhang
2020-12-16 23:59:11 +08:00
Java 的话, CompleteFuture 或者 RxJava 或者 Future
DoctorCat
2020-12-17 01:57:50 +08:00
看起来是架构方案题,不是编程细节吧。b 调用 a,并降低时延,意味着 b 与 a 的调用链路最短+系统状态保持最优啊。如果分别部署在不同实例,那最好 b 与 a 同一个机架同一个子网,物理距离和网络逻辑位置最短的原则。
数据聚合最好设计一个数据聚合层比如引入 MQ 而且最好是 pubsub 机制……保持 tcp 长连接替代 HTTP 等等,还有 kernel 网络相关的调优、系统进程 CPU 亲和性的调优等等。
beidounanxizi
2020-12-17 02:33:21 +08:00
@luxinfl go 的 waitgroup Java 的 countdownlatch 都可以实现 ,
carlclone
2020-12-17 06:52:39 +08:00
这题难道不是考察分布式事务吗,楼上的都在讲什么乱七八糟的
noogler67
2020-12-17 08:44:47 +08:00
时延的话,就是同时发起 acde,等完成后再发起 b
anthow
2020-12-17 08:55:52 +08:00
整几个 CompletableFuture
Peachl
2020-12-17 09:00:55 +08:00
@carlclone 分布式事务是保证事务的 明显这个位置问的是如何做到顺序性的 completableFuture 就是正解
blessyou
2020-12-17 09:18:49 +08:00
js 的话大概是 Promise.all()
TonyYOYO
2020-12-17 09:33:15 +08:00
@fanyiaa 你可笑死我了
liuhuan475
2020-12-17 09:41:56 +08:00
Future
sonice
2020-12-17 09:55:47 +08:00
```
CompletableFuture<String> futureAb = CompletableFuture.runAsync(() -> {
// no operation
}).thenApply(b-> "ab");

CompletableFuture<String> futureC = CompletableFuture.supplyAsync(() -> "c");
CompletableFuture<String> futureD = CompletableFuture.supplyAsync(() -> "d");
CompletableFuture<String> futureE = CompletableFuture.supplyAsync(() -> "e");

String collect = Stream.of(futureAb, futureC, futureD, futureE)
.map(CompletableFuture::join)
.collect(Collectors.joining(" "));

//output: ab c d e
System.out.println(collect);
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/736181

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX