首页 > 解决方案 > 使用 SpringBoot 非阻塞 WebClient 通过 HTTP 分发任务(性能问题?)

问题描述

我有大量任务 - N,需要通过负载均衡器分发到多个 http 工作节点。虽然存在多个节点 - n,但结合所有节点,我们有一个最大并发设置 - x。

Always
N > x > n 

一个节点可以在多个线程中运行这些任务。每项任务的平均时间消耗约为 50 秒到 1 分钟。使用 Web-Client 分发任务和来自 Workers 的 Mono 响应。

有一个分销商,设计流程如下:

 1. Remove a task from queue.
 2. Send the task via POST request using Web-Client and subscribe immediately with a subscriber instance
 3. Holt new subscription when max concurrency reached to x
 4. When any one of the above distributed task completes it calls on-accept(T) method of the subscriber.
 5. If task queue is not empty, remove and send the next task / (x+1) task.
 6. Keep track of total number completed tasks.
 7. If all tasks completed & queue empty set Completable Future object as complete
 8. Exit

上述过程工作正常。使用 N=5000、n=10 和 x=25 进行测试。

现在的困惑是在这个设计中我们总是有 x 个并发订阅。一旦一个结束,我们就会创建另一个,直到所有任务都完成。这对大规模生产环境有什么影响?如果通过 HTTP(s) 负载均衡器增加并发订阅的数量(x > 10,000)是否会对性能和网络延迟产生严重影响?我们的预期产量将如下所示:

N=200,000,000
n=100
x=10,000

如果有 Reactor 知识和 Web-Client 专业知识的人对此方法发表评论,我将不胜感激。我们主要关心的是有太多的并发订阅。

标签: concurrencyspring-webfluxproject-reactorspring-webclientreactor-netty

解决方案


推荐阅读