以反应方式协调多个传出请求

coordinating multiple outgoing requests in a reactive manner

这更像是一个最佳实践问题。 在我当前的系统(单体)中,单个传入的 http api 请求可能需要从多个后端源收集类似结构的数据,聚合它,然后才 return 将数据发送给客户端以响应API.

在当前的实现中,我只是使用线程池将所有请求并行发送到后端源,并使用某种倒计时锁存器来了解所有请求 returned.

我正在尝试找出使用 vert.x/quarkus 等反应堆来转换上述内容的最佳实践。我想保持接受此 api 调用的服务的反应性,通过 http 调用多个(相似的)后端源,聚合数据。

我可以粗略地猜测我可以对传入请求使用 rest-easy 反应式的东西,也可以对后端请求使用 MP HTTP 客户端(不确定它的反应式),但我不确定什么可以代替我的线程池并行执行事物,什么是聚合 returns.

数据的最佳方式

我假设使用 http 反应式客户端,我可以在一个循环中调用所有后端源,并且因为它是反应式的,所以它会 'feel' 像并行工作一样。也许 returned 数据应该通过流 API 聚合(加入数据流)?但TBH我不确定。 我知道这是一个很长很长的问题,但一些建议会很好。

谢谢!

您可以放弃线程池,您不需要它来并行调用您的后端服务。

是的,MP RestClient 是反应式的。假设您有此服务调用后端来获取喜剧反派:

@RegisterRestClient(configKey = "villain-service")
public interface VillainService {

    @GET
    @Path("/")
    @NonBlocking
    @CircuitBreaker
    Uni<Villain> getVillain();

}

还有一个类似的英雄,HeroService。您可以将它们注入您的端点 class,检索一个恶棍和一个英雄,然后计算战斗:

@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);
                });
    }
}