concurrency - 使用 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 专业知识的人对此方法发表评论,我将不胜感激。我们主要关心的是有太多的并发订阅。
解决方案
推荐阅读
- android - 从 Android Studio 运行应用程序与其 APK 有什么区别?
- javascript - 我想了解如何使用以下模式在 javascript 中创建函数不会引发错误
- javascript - 是否可以使用尚不存在的参数传入函数?
- python - 按下按钮事件时如何使用新的 wx.panel 或 wx.ListBox
- c# - 计时器为空。你调用的对象是空的
- python - 如何将图像中的标题和标题与正文分开
- ios - 更改 MKMapView 的缩放 - Swift 4
- opengl - OpenGL 3.3 Core-Profile:如何管理缓冲区数组以绘制多个图元?
- javascript - 将 Javascript 或 Jquery 中的字符串输出(显示)到 html 中的一行
- python - 通过 send_keys() 发送的字符序列与通过 Python 和 Selenium 呈现的默认文本连接起来