【问题标题】:How to Automatically scale up/down workers?如何自动扩大/缩小工人?
【发布时间】:2012-06-12 21:45:29
【问题描述】:

如何自动扩展工作任务?

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

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

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

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

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

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

【问题讨论】:

    标签: c# multithreading scalability worker


    【解决方案1】:

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

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

    【讨论】:

    • 本例中的工作,是可以分发的块...该工作实际上是向 Apple Push 通知服务、google C2DM 和 windows phone 通知发送消息。就苹果而言,每个工作人员都与苹果的服务器保持连接并发送消息,这就是为什么并行执行将有助于扩展(在某种程度上)。
    【解决方案2】:

    您还可以计算每秒排队任务数的全局运行平均值,然后除以一个工作人员每秒可以处理的最大任务数。这将为您提供不落后的工人数量。

    您还想引入延迟,(如果 x 秒内工人数量减少,则需要增加)(如果 x 秒内工人数量多,则需要减少)。

    这假设所有任务都需要相同的时间来处理,并且所有工作人员都具有相同的吞吐量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多