0

如何自动扩展工作任务?

我有一个应用程序,我想自动扩展工作任务的数量以适应要处理的项目的吞吐量(显然对工作人员的数量有最大限制)。

所有要处理的项目都通过一个点进行路由,从那里它们被分配到工作任务中(现在我找到具有最短队列的工作人员,并将项目排入队列)。

什么是一个好的模式或技术可以用来做出一些明智的决定,比如我应该让多少工人来处理这些物品?如果项目能够由较少的工人及时处理,则此逻辑需要包括关闭工人。

我意识到添加更多的工人不会无限扩展,因为最终其他资源会成为瓶颈,并且在某些时候增加更多的工人会比帮助更多。如果我能解释这一点,并决定减少工人的数量以自动找到“最佳位置”,那就太好了,但是在这一点上,如果我的系统可以增加工人的数量,我会很高兴的添加更多项目,然后在需要较少项目时减少数量。

我玩弄过的一个想法是测量一个项目在队列中的平均时间。如果这个平均时间大于几秒钟,我应该启动更多的工人(直到达到设定的最大限制)。如果平均时间少于 1 秒,我应该减少更多的工人(当然,直到只剩下一个)。

有人对解决此问题的最佳方法有任何建议吗?

4

2 回答 2

0

You could also compute a global running average of number of queued task per seconds, and divide by maximum task per seconds one worker can process. This will give you the number of worker you need to not fall behind.

You also want to introduce a delay, (if for x seconds there is less worker then needed increase) (if for x seconds there is more worker then needed decrease).

This assume all task take the same amount of time to process and that all your worker have the same throughput.

于 2013-11-05T18:28:15.997 回答
0

除非您可以将工作分解为可以在工作人员之间分配的块,否则您将无法扩展。你如何分配这项工作实际上取决于你如何分解工作。如果您将工作分解为较小的块,其结果在完成后合并,那么 map/reduce 模式可能符合要求......

不管你做什么,要记住的一件事是,一旦你运行的线程多于 CPU,你的性能就会急剧下降。这是因为您增加/引入了非常昂贵的上下文切换。使用 TPL 和 PLINQ 之类的东西可以让您安排任务并避免这个问题。

于 2012-06-08T20:28:18.740 回答