Gea*_*ric 3 java reactive-programming microservices quarkus mutiny
在我的 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)...
Run Code Online (Sandbox Code Playgroud)
第二种方法基于Multi..onItem().transformToMultiAndConcatenate().collect()
Multi.createFrom().iterable(parameters)
.onItem()
.transformToMultiAndConcatenate(p -> callService(p))
.collect().asList()
Run Code Online (Sandbox Code Playgroud)
一开始,我认为这两种方法之间不存在任何真正的区别,因为它们Uni是惰性评估的,或者Uni.combine对Multi.collect我来说就像语法糖。但我还是想问一下,有什么区别吗?尤其是性能方面的差异。
使用第一种方法,我正在调试一个错误,当 的大小parameters超过 25 时,它开始给出错误,但在 25 以下则很好。因此,我怀疑第一种方法会产生非常高的 QPS,从而淹没外部服务。但是,我怀疑第二种方法是否有助于限制。
小智 11
Uni组合(Uni.combine().all().uni(...))之间的并发模型transformToMultiAndConcatenate是transformToMultiAndMerge不同的。
Uni 组合同时运行所有通过的 Unis。因此,如果您通过,假设有 100 个 uni,则所有 100 个 uni 将同时执行。就您而言,这意味着发送 100 个请求。因此,是的,最好确保远程服务能够正常处理并发请求。组合函数按照与组合 unis 相同的顺序接收结果列表。因此,组合 UniA 和 UniB 将生成一个包含 ResponseForA、ResponseForB 的列表。
transformToMultiAndConcatenate并发transformToUniAndConcatenate级别为 1。基本上,它会单独从上游获取每个项目,调用您的服务,完成后切换到下一个项目。所以,这里没有太多并发性。但是,它保证响应的顺序与上游项目的顺序相同。因此,如果您将 [A, B, C] 作为上游项目,则生成的多重结果将是 [A 的响应,B 的响应,C 的响应]。
transformToMultiAndMerge并将transformToUniAndMerge同时执行一些请求。默认并发数为 128。因此,它将消耗来自上游的 128 个项目并调用您的远程服务。回复可能不会被排序。一旦收到一个响应,就会消耗另一项。因此[A,B,C]可能会产生[B的响应,C的响应,A的响应]。
使用合并时,可以使用以下方式配置并发:multi.onItem().transformToMulti(mapper).merge(concurrency)
供参考:
| 归档时间: |
|
| 查看次数: |
7462 次 |
| 最近记录: |