0

我在一家车队跟踪公司工作,这个问题专门关于我打算如何做报告。让我解释一下我们的环境。我们有 1x 数据库、1x 负载分配进程和 3x 报告处理服务器(假设它们在各个方面都是相等的)。当客户请求报告时,该报告的所有参数都会进入数据库。我目前正在开发一个负载分配应用程序,该应用程序将从数据库中获取待处理的报告,并将它们委托给 3 个报告处理服务器,这些服务器构建并通过电子邮件发送报告。当服务器完成报告(或出现错误)时,它会通知负载分配应用程序。报告可以有各种大小,从 1 天的 1 辆车的 GPS 数据到 3 个月的数百辆车的 GPS 数据。

我可以想到几种方法来进行负载平衡,但我对它们不太满意。我可以让每台服务器最多只做 5 个报告,但是一台服务器可能会得到 5 个小报告,而另一台服务器可能会得到 5 个大报告。我可以做一个“循环”的方法,只是在服务器上按顺序分发报告,但这仍然不能防止任何服务器过载。

我认为我现在最好的想法是计算每个报告需要多少 GPS 数据(这是一项简单的任务),并且当我将报告分配给每个服务器时,我会为每个服务器保留一个运行总数。当服务器完成报告(并通知负载平衡器)时,从该服务器的运行总数中减去该报告的 GPS 数据量。这样,我可以将下一个报告分配给使用最少 GPS 数据的服务器。我还可以设置一个最大值,这样服务器就不会过度工作(导致我们从一开始就重构整个报告流程的问题)。如果在所有服务器都达到最大值时还有更多报告,它可以将它们排队并稍后在服务器完成一些报告时尝试它们。

我不相信这是尽快完成报告的最佳方法。这些只是我迄今为止想出的最好的。

如何优化我的方法以在多台服务器上平衡不同大小的报告?

4

1 回答 1

0

假设您只有一个从中选择数据的主表,那么我将配置一台服务器首先处理所有大报告,然后让其他两个从最小到最大处理。否则可能永远无法完成大型报告。

对于较小的报告,您想在没有更好的情况下尝试让他们尝试运行“类似”报告,这意味着那些围绕主要使用的索引中的相似值聚集的报告。例如,如果服务器刚刚完成了 2011 年 6 月的报告,那么下一个要运行的最佳报告是同一时期,而不是跳到 2012 年 11 月。虽然这取决于实际表格,但我假设您订购了很多日期包含大部分选择的数据。您真正想做的只是将可能重用缓存索引/等的报告分组,因为这应该可以提供最佳吞吐量。

我有一个类似的调度问题,任何针对主要表的查询都转到一台服务器(慢队列),而其他任何查询都转到另一台服务器(快速队列),特殊情况除外。

于 2013-02-03T11:20:25.993 回答