2009-02-25 98 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秒,因爲我忘記在每個表中大量使用額外的索引。

讓我們知道它是怎麼回事!