以反应方式协调多个传出请求
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);
});
}
}
这更像是一个最佳实践问题。 在我当前的系统(单体)中,单个传入的 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);
});
}
}