私の Quarkus サービスでは、外部サービスから結果のリストを取得する必要があり、同じ目標を達成する方法が 2 つあります。
に基づく最初のアプローチ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)...
に基づく2番目のアプローチMulti..onItem().transformToMultiAndConcatenate().collect()
Multi.createFrom().iterable(parameters)
.onItem()
.transformToMultiAndConcatenate(p -> callService(p))
.collect().asList()
最初は、2 つのアプローチの間に真の違いはないと思います。Uni遅延評価され、またはどちらUni.combineかMulti.collectが私にとって構文糖衣のようなものだからです。しかし、私はまだ違いがあるかどうか尋ねたいと思いますか?特に性能面での違い。
最初のアプローチでは、サイズparametersが25を超えるとエラーが発生し始めますが、25未満では問題ないというエラーをデバッグしています。したがって、最初のアプローチでは非常に高い QPS が発生し、外部サービスがフラッディングされると思われます。ただし、2番目のアプローチがスロットリングにも役立つとは思えません。