sql-server - 设置报告服务器以从网络服务器中释放资源

标签 sql-server security coldfusion report

耶,第一篇关于SO的帖子! (杰夫等人干得好)

我们正在尝试解决我们的一个网络应用程序中的瓶颈,该瓶颈是在我们开始允许用户按需生成报告时引入的。

我们的基础设施如下: 1 台服务器充当 Web 服务器/数据库服务器(ColdFusion 7 和 MSSQL 2005)

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

在生成报告的高峰时段,由于 SQL Server 使用资源进行大量查询以及随后 ColdFusion 生成多页 PDF,它会导致 Web 应用程序和前端网站达到 Not Acceptable 速度。

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

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

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

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

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

最佳答案

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

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

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

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

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

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

关于sql-server - 设置报告服务器以从网络服务器中释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/587638/

相关文章:

mysql - Django,权限错误:OSError at/upload/[Errno 13] Permission denied:

jquery - Flexigrid for jQuery - 如何编辑/更新网格中的记录?

sql - 选择某一列上具有 MAX() 值的行

sql-server - 具有可为 null 的输出参数的 SQL Server 2016 CLR 存储过程

java - 保护有状态的 Web 服务

model-view-controller - ColdFusion Model Glue 与 ASP.NET MVC 3 的 @section 的等效项是什么?

java - ColdFusion JVM : strange memory behaviour

sql - MS SQL 临时表循环

sql - UNPIVOT/PIVOT 将多个记录合并为一个

java - 使用 TripleDES 加密时将初始化 vector (IV) 附加到加密字节