C# 如何自动放大/缩小工作人员?

C# 如何自动放大/缩小工作人员?,c#,multithreading,scalability,worker,C#,Multithreading,Scalability,Worker,如何自动缩放辅助任务 我有一个应用程序,我想自动调整工作任务的数量,以适应要处理的项目的吞吐量(工作任务的数量有一个最大限制) 要处理的所有项目都通过一个点进行路由,从该点开始,它们分布在辅助任务中(现在我找到队列最短的辅助任务,并将项目排队) 对于我应该安排多少工人来处理这些项目,使用什么样的模式或技术来做出一些明智的决定?如果项目能够由较少的工人及时处理,则该逻辑需要包括关闭工人 我意识到,增加更多的工人不会无限扩大,因为最终其他资源将受到限制,而且在某个时候,增加更多的工人将弊大于利。如果

如何自动缩放辅助任务

我有一个应用程序,我想自动调整工作任务的数量,以适应要处理的项目的吞吐量(工作任务的数量有一个最大限制)

要处理的所有项目都通过一个点进行路由,从该点开始,它们分布在辅助任务中(现在我找到队列最短的辅助任务,并将项目排队)

对于我应该安排多少工人来处理这些项目,使用什么样的模式或技术来做出一些明智的决定?如果项目能够由较少的工人及时处理,则该逻辑需要包括关闭工人

我意识到,增加更多的工人不会无限扩大,因为最终其他资源将受到限制,而且在某个时候,增加更多的工人将弊大于利。如果我能解释这一点,并决定减少工人数量以自动找到“最佳点”,那将是非常棒的,但是在这一点上,如果我的系统能够在添加更多项目时增加工人数量,然后在需要更少项目时减少工人数量,我会很高兴

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


有没有人对解决这一问题的最佳方法有什么建议?

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


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

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

您还需要引入一个延迟(如果x秒的工作人员较少,则需要增加)(如果x秒的工作人员较多,则需要减少)


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

本例中的工作是可以分布的块。。。这项工作实际上是向苹果推送通知服务、谷歌C2DM和windows phone通知发送消息。在苹果的例子中,每个工作人员都与苹果的服务器保持连接并发送消息,这就是为什么并行工作将有助于扩大规模(在某种程度上)。