quarkus - 以 react 方式协调多个传出请求

标签 quarkus vert.x reactive mutiny

这更多的是一个最佳实践问题。 在我当前的系统(整体)中,单个传入的 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/

相关文章:

azure - 如何在 Quarkus 中连接到 Azure ServiceBus

keycloak - 客户端应用程序未注册为资源服务器

java - N+1 HTTP 调用通过同时队列进行批处理

r - 访问 reactiveValuesToList 中的 reactiveValues

quarkus - 在 Quarkus 中使用自定义身份提供商

java - Quarkus 开发模式显示没有静态文件

java - 具有异步支持的基于连接池的 Web 服务器与基于事件循环的 Web 服务器

java - Vertx.io GET 无提示失败

java - 两个互相隔离的顶点实例

javascript - 如何在 RxJS 中使用 concat 运算符,但忽略第一个可观察的所有排放