在我的 Quarkus 服务中,我需要从外部服务获取结果列表,我发现有两种方法可以实现相同的目标:
第一种方法基于Uni.combine().all()
:
List<Uni<Result>> results = new ArrayList();
for (Parameter p : parameters) {
// callService returns Uni<Result>
results.add(callService(p));
}
// collect all the results
Uni<List<Result>> combined = Uni.combine().all().unis(results)...
第二种方法基于Multi..onItem().transformToMultiAndConcatenate().collect()
Multi.createFrom().iterable(parameters)
.onItem()
.transformToMultiAndConcatenate(p -> callService(p))
.collect().asList()
一开始,我认为这两种方法之间没有任何真正的区别,因为Uni
它们是懒惰地评估的,或者Uni.combine
对Multi.collect
我来说就像语法糖一样。但是我还是想问一下有没有区别?特别是性能方面的差异。
使用第一种方法,我正在调试一个错误,当大小parameters
超过 25 时它开始给出错误但低于 25 就可以了。因此,我怀疑第一种方法会导致非常高的 QPS 淹没外部服务。但是,我怀疑第二种方法也有助于节流。