我想问一下是否有人对以下场景的最佳(最快)算法有一个想法:
- X 进程生成一个非常大的文件列表。每个进程一次生成一个文件
- Y 进程被通知文件已准备好。每个 Y 进程都有自己的队列来收集通知
- 在给定时间,1 X 进程将通过具有 Round Rubin 算法的负载均衡器通知 1 Y 进程
- 每个文件都有大小,自然,更大的文件会让 X 和 Y 更忙
限制
- 一旦文件进入 Y 进程,将其删除并将其移动到另一个 Y 进程是不切实际的。
目前我想不出其他限制。
这种方法的缺点
- 有时 X 落后(文件不再被推送)。它并没有真正受到排队系统的影响,无论我是否改变它,它仍然会有缓慢/美好的时光。
- 有时 Y 落后(很多文件聚集在队列中)。再一次,和以前一样。
- 1 Y 进程正忙于处理一个非常大的文件。它的队列中还有几个小文件可以被其他 Y 进程处理。
- 通知本身是通过 HTTP 进行的,有时似乎不可靠。通知失败,调试没有显示任何内容。
还有一些细节有助于更清楚地看到图片。
- Y 进程是数据库线程/作业
- X 进程是 Web 应用程序
- 一旦文件到达 X 进程,这些也会通过查询从 DB 端消耗资源。对生产部分有影响
现在我考虑了以下方法:
- X 将像以前一样生成文件,但不会通知 Y。它将保存一个缓冲区(表)来填充文件列表
- Y 将不断在缓冲区中搜索文件并自行检索它们并将它们存储在自己的队列中。
现在这种改变是否可行?就像我说的,每个 Y 进程都有自己的队列,保留它似乎不再有效。如果是这样,那么我仍然不确定下一点:
如何决定要获取哪些文件
我已经通读了背包问题,我认为如果我从一开始就拥有整个文件列表,而我没有。实际上,我确实有每个文件的列表和大小,但我不知道每个文件什么时候准备好接收。
我已经解决了生产者-消费者问题,但它以固定缓冲区为中心并对其进行了优化,但在这种情况下,缓冲区是无限的,我真的不在乎它是大还是小。
下一个最佳选择是贪婪方法,其中每个 Y 进程锁定最小的文件并获取它。起初,它似乎确实是最快的方法,我目前正在构建一个模拟来验证这一点,但第二种意见会很棒。
更新 为了确保每个人都能了解大局,我在这里链接了一个快速完成的图表。
- 作业独立于流程。它们将以一定速度运行并处理可能的文件数量。
- 当 Job 完成一个文件时,它将向 LB 发送一个 HTTP 请求
- 每个进程对来自 LB 的请求(文件)进行排队
- LB 采用循环规则