4

耶,第一次发帖!(杰夫等人干得好。)

当我们开始允许用户按需生成报告时,我们正在尝试解决其中一个 Web 应用程序中的瓶颈问题。

我们的基础架构如下: 1 台服务器充当 Webserver/DBServer(ColdFusion 7 和 MSSQL 2005)

它为我们的后端用户和前端网站提供 Web 应用程序。报告由用户从后端生成,因此用户必须登录(基于 Web)具有一定的安全级别。

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

我们不确定消除一些负载的最佳做法是什么,但目前还不能选择限制对报告的访问。

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

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

我们也想将该任务卸载到报告服务器,但是在安全的 Web 应用程序中,我们不能只触发 HTTP GET 来创建 PDF,用户从服务器 1 登录 Web 应用程序并将其显示在web-application 但在服务器 2 上生成/获取它而不验证用户的凭据...

有人有这方面的经验吗?提前感谢堆栈溢出!

4

4 回答 4

3

最基本的最佳实践是不要将 Web 服务器和数据库服务器放在同一硬件上。我会从那开始。

于 2009-02-25T20:55:13.087 回答
3

“我们也希望将该任务卸载到报告服务器,但是在安全的 Web 应用程序中,我们不能只触发 HTTP GET 来创建 PDF,用户从服务器 1 登录 Web 应用程序并在其中显示它Web 应用程序但在服务器 2 上生成/获取它而不验证用户的凭据..."

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

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

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

现在是pdf本身。我在传递中完成的方法之一是根据传递的一些参数(用户凭据和生成的用于运行查询的 sql)生成哈希,然后在生成 pdf 后,将哈希分配给 pdf 的名称并将其保存在磁盘上。现在您有了一个简单的缓存系统,您可以在其中查看 pdf 是否已经存在,如果存在,则返回它,否则生成并缓存它。

最后,您的问题不是大多数人以前从未见过的。你只需要做一些工作,你的应用程序就会更快。

于 2009-02-26T13:33:22.097 回答
1

您必须区分生成 PDF 和进行计算之间的感知。两者都是单独的步骤。

你能做的是

1) 创建一个每天运行的报告计算表,并用所有报告的所有计算值填充它。

2) 当有人请求 PDF 报告时,让报告对预先计算的值进行简单的选择查询。与动态计算相比,它的数据库工作量要少得多。如果它使用精美的 pdf 设置,您可以使用 Coldfusion 生成 PDF。否则,您可能能够以文本形式使用原始 PDF 格式(类似于 html 标记),或者使用另一个库(cfx_pdf、合适的 java 库等)来生成它们。

如果用户不需要下载,只需要查看/打印报告,你能用闪纸逃脱吗?

另一种方法是建立一个报告队列。不管你是否把它放在第二台服务器上,如果你能摆脱它,CF 可以做什么,你可以将报告请求放入队列,并在处理时将它们通过电子邮件发送给用户。

然后,您可以通过计划的流程控制队列,以根据需要定期运行,并且一次只创建几个报告。我不确定这是否适合您的情况。

如上所述,执行存储过程也可能会有所帮助,并确保您在 MySQL 中正确设置了索引。我曾经有一个 3 分钟的查询,我把它缩短到 15 秒,因为我忘记在每个表中声明被大量使用的附加索引。

让我们知道怎么回事!

于 2009-02-27T19:42:14.867 回答
0

除了建议分离网络和数据库服务器之外,我还尝试过:

a) 将查询移动到存储过程中,如果您还没有使用它们;

b) 通过调度程序生成报告,并将它们缓存在特殊表中,处于随时可用的状态,因此客户只需通过很少的快速查询来选择它们——这也应该减少客户的报告构建时间。

希望这可以帮助。

于 2009-02-25T21:13:04.743 回答