这更多的是一个最佳实践问题。 在我当前的系统(整体)中,单个传入的 http api 请求可能需要从多个后端源收集类似结构的数据,将其聚合,然后才在 API 的响应中将数据返回给客户端。
在当前的实现中,我只是使用线程池将所有请求并行发送到后端源,并使用倒计时锁存器来了解所有返回的请求。
我正在尝试找出使用像 vert.x/quarkus 这样的 Reactice 堆栈来转换上述内容的最佳实践。我想保持接受此 api 调用的服务的 react 性,通过 http 调用多个(类似的)后端源,聚合数据。
我可以粗略地猜测我可以使用诸如rest-easyreactive之类的东西来处理传入的请求,也许可以使用MP HTTP客户端来处理后端请求(不确定它的 react 性),但我不确定什么可以代替我的线程池来执行事情并行以及聚合返回数据的最佳方式是什么。
我假设使用 http 响应式(Reactive)客户端,我可以在循环中调用所有后端源,并且因为它是响应式(Reactive)的,所以它会“感觉”像并行工作。也许返回的数据应该通过流 API 聚合(以加入数据流)?但说实话我不确定。 我知道这是一个很长的问题,但一些指示会很棒。
谢谢!
最佳答案
您可以删除线程池,您不需要它来并行调用后端服务。
是的,MP RestClient 是响应式(Reactive)的。假设您有一个调用后端来获取漫画恶棍的服务:
@RegisterRestClient(configKey = "villain-service")
public interface VillainService {
@GET
@Path("/")
@NonBlocking
@CircuitBreaker
Uni<Villain> getVillain();
}
还有一个类似的英雄服务,HeroService
。您可以将它们注入(inject)端点类中,检索恶棍和英雄,然后计算战斗:
@Path("/api")
public class Api {
@RestClient
VillainService villains;
@RestClient
HeroService heroes;
@Inject
FightService fights;
@GET
public Uni<Fight> fight() {
Uni<Villain> villain = villains.getVillain();
Uni<Hero> hero = heroes.getRandomHero();
return Uni.combine().all().unis(hero, villain).asTuple()
.chain(tuple -> {
Hero h = tuple.getItem1();
Villain v = tuple.getItem2();
return fights.computeResult(h, v);
});
}
}
关于quarkus - 以 react 方式协调多个传出请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72352005/