2009-02-25 87 views
4

Yay,首先发布在SO! (Good work Jeff等人)设置报表服务器以从网络服务器释放资源

我们正试图解决我们开始允许用户按需生成报告时引入的其中一个Web应用程序的瓶颈。

我们的基础设施如下: 1服务器作为Web服务器/ DBSERVER(ColdFusion的7和MSSQL 2005)

它是服务于网络的应用为我们的后端用户和前端网站。这些报告由后端用户生成,因此用户必须登录(基于Web)的安全级别。

在生成报告的高峰时段,由于SQL Server使用大量查询的资源以及之后的ColdFusion生成多页PDF,因此网络应用程序和前端网站的速度令人难以接受。

我们不完全确定删除一些负载的最佳做法是什么,但限制访问报告目前不是一种选择。

我们考虑过将数据非规格化到其他表格,以简化最常见的查询,但似乎这只会进一步推动问题。

因此,我们正在考虑让第二台服务器作为“报告服务器”,并将其用于运行查询的我们数据库的复制副本。这将解决一个问题,但第二个问题仍然存在:生成PDF是资源密集型的。

我们希望将该任务卸载到报告服务器,但是在安全的Web应用程序中,我们不能仅仅通过用户从服务器1登录Web应用程序来启动HTTP GET来创建PDF,并且在网络应用程序中显示它,但在服务器2上生成/提取它而不验证用户的凭证...

任何人都有这方面的经验?在此先感谢堆栈溢出!

回答

3

“我们希望将该任务卸载到报告服务器,但是在安全的Web应用程序中,我们不能仅仅通过用户从服务器1登录Web应用程序来启动HTTP GET来创建PDF并将其显示在网络应用程序中,但在服务器2上生成/提取它而不验证用户的凭证...“

为什么你不能?你正在使用世界上最简单的语言编写web服务。这里是我的建议。

首先,将数据库移动到它自己的服务器,从而在单独的服务器上安装cf和sql服务器。做这件事的第一个原因是表现。如前所述,在同一台服务器上同时安装cf和sql不是一个理想的设置。第二个原因是为了安全。如果有人能够破解你的网络服务器,那么在那里得到你的数据。你应该在你的cf和sql server之间有一个防火墙,以提供更多的安全性。最后一个原因是可扩展性。如果您需要投入更多资源或将您的数据库集群,那么当它位于自己的服务器上时更容易。

现在为web服务。你可以做的是在另一台服务器上安装cf并编写webservices来处理报告的生成。只需锁定新的cf服务器以仅接受ssl连接并将用户的登录凭据传递给web服务。在您的web服务中,在调用生成报告的方法之前对用户进行身份验证。

现在为PDF本身。我在通道中完成的一种方法是基于传递的一些参数(用户证书和生成的sql来运行查询)生成散列,然后一旦生成pdf,就将散列分配给pdf的名称并将其保存在磁盘上。现在你有一个简单的缓存系统,你可以看看pdf是否已经存在,如果存在,返回它,否则生成并缓存它。

最后,你的问题不是以前没有见过的。你只需要做一些工作,你的应用就会更快。

+0

感谢所有的答复。哈希作为文件名是一个非常好的主意,用户一遍又一遍地生成相同的报告是一个问题。我们现在有一个坚实的基础来指导自己。 – jfrobishow 2009-02-26 14:58:01

3

最基本的最佳做法是不要在同一硬件上安装Web服务器和数据库服务器。我会以此开始。

0

除了建议单独的Web &数据库服务器,我想:

一)移动查询到存储过程,如果你尚未使用它们; b)通过调度程序生成报告并将它们缓存在即用状态的特殊表中,这样客户只需选择几个快速查询即可 - 这也应该减少客户的报告生成时间。

希望这会有所帮助。

+0

嗨,谢谢你的帮助。查询本身就是问题的一部分,但我会说30%的问题是在生产服务器上实时生成PDF。 所以我仍然想知道什么是最好的,以抵消该任务到另一台服务器瓦特/ o妥协的Web应用程序的安全性。 – jfrobishow 2009-02-26 03:48:22

1

你必须分开生成PDF和做计算之间的感知。两者都是分开的步骤。

你可以做的是

1)创建报表计算表,将每天和填充它运行与您的所有报告中的所有计算值。

2)当有人请求PDF报告时,让报告对预先计算的值进行简单的选择查询。它将比在飞行中计算少得多的分贝工作量。如果使用的是精美的pdf设置,您可以使用coldfusion生成PDF。否则,您可能能够以文本形式使用原始PDF格式(与HTML标记类似),或使用其他库(cfx_pdf,合适的Java库等)来生成它们。

如果用户不需要下载并且只需要查看/打印报告,您是否可以使用闪存纸?

另一种方法是构建报告队列。无论您是否将其放在第二台服务器上,如果您可以摆脱它,CF可以做些什么,您可以将报告请求放入队列中,并在处理完成后通过电子邮件发送给用户。

然后,您可以通过计划的过程控制队列,以便按照您的喜好定期运行,并且一次只创建一些报告。我不确定这是否适合您的情况。

如上所述,执行存储过程也可能有所帮助,并确保您在MySQL中正确设置了索引。我曾经有一个3分钟的查询,我放下了15秒,因为我忘记在每个表中大量使用额外的索引。

让我们知道它是怎么回事!