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



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

在当前的实现中,我只是使用一个线程池来并行地将所有请求发送到后端源,并使用倒计时锁来了解所有返回的请求。

我正试图找出最佳实践转换上面描述的使用像vert.x/quarkus的反应堆栈。我想保持服务的反应性,接受这个API调用,通过http调用多个(类似的)后端源,聚合数据。

我可以大致猜测我可以使用的东西,如rest-easy响应的传入请求,也许MP HTTP客户端后端请求(不确定它的响应),但我不确定什么可以取代我的线程池并行执行的事情,什么是最好的方式来聚合返回的数据。

我假设使用http响应式客户端,我可以在一个循环中调用所有后端源,因为它是响应式的,所以它会"感觉"像并行工作。也许返回的数据应该通过流API进行聚合(以连接数据流)?但说实话,我不确定。我知道这是一个很长的问题,但一些指示将是伟大的。

谢谢!

你可以删除线程池,你不需要它来并行调用你的后端服务。

是,MP RestClient是响应的。假设您有以下服务,该服务调用后端来获取漫画反派:

@RegisterRestClient(configKey = "villain-service")
public interface VillainService {
@GET
@Path("/")
@NonBlocking
@CircuitBreaker
Uni<Villain> getVillain();
}

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

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

相关内容

  • 没有找到相关文章

最新更新