【问题标题】:How to Reactor Netty parallel Http Requests keep call order?如何反应 Netty 并行 Http 请求保持调用顺序?
【发布时间】:2021-12-01 21:04:34
【问题描述】:
我想使用HttpClient 并行发送大量http 休息请求,反应式。没关系,我可以创建客户端,订阅它,并很好地发送消息。但我的问题是,我想在我的系统中为每个用户订购我的 http 请求。因此,例如,我想按顺序为 userA 发送 50 条消息,也为 userB 发送 50 条消息,但是 userA 和 userB 的发送应该并行工作。
最后我尝试使用.block() 方法创建HttpClient,并为每个用户启动一个Spring @Async 方法,但整个过程是非并行的。
总之,我希望每个用户以阻塞方式发送 Http 消息,但这些阻塞发送必须以某种方式并行运行,以免阻塞彼此的进度。
你对这个问题有什么建议吗?谢谢!
【问题讨论】:
标签:
java
spring
netty
reactor-netty
【解决方案1】:
您可以使用#subscribeOn 将不同的用户 工作负载(请求)安排在不同的线程中,然后使用#collectList 收集请求结果,从而生成一个Mono,该Mono 可以与其他线程连接使用concatWith 的工作负载结果(以相同方式构建)。
假设您的客户端请求被建模为Flux<?> requests(String user),这里有一个说明:
List<?> user1Results = requests("user1")
.subscribeOn(Schedulers.elastic())
.collectList()
.block();
List<?> user2Results = requests("user2")
.subscribeOn(Schedulers.elastic())
.collectList()
.block();