2010-03-23 33 views
5

我正在處理的應用程序的一部分是swf,它顯示了一個包含約80個問題的測試。每個問題都通過WebORB和ASP.NET保存在SQL Server中。使用數據庫或MSMQ排隊?

如果候選人完成測試,則需要驗證該會話。問題是,有時有350名候選人在同一時間完成測試,並且Web服務器和SQL Server上的CPU爆炸(同時發生350次驗證)。

現在,我應該如何在這裏實施排隊?在數據庫中,有一個表格爲每個會話記錄。一列保存狀態。 1完成,2驗證。

我可以實現兩種方式排隊(因爲我看到它,也許你有其它的命題):

  • 與狀態1.檢查表中記錄的方法,如果找到了,它驗證會話。所以,會話一個接一個地被驗證。
  • 如果候選人完成其會話,則將消息發送到MSMQ隊列。另一個進程監聽隊列並逐一驗證會話。

現在:

  • 什麼是最好的辦法?
  • 你在哪裏開始驗證會話的過程?在你的global.asax(application_start)?作爲一個Windows服務?作爲在application_start中啓動的網站的根目錄的exe文件?

對我來說,使用表格並查找狀態爲1的記錄似乎是最簡單的方法。

回答

4

MSMQ方法decouples您的面向Web的應用程序來自驗證邏輯服務和數據庫。

這帶來了很多好處,幾其中:

  • 這將是比較容易處理,其中驗證邏輯能處理每秒5次的情況下,它接收300的一次。否則,您將不得不處理重複超時,重新嘗試等。

  • 對驗證服務進行維護可能更容易,而不必中斷應用程序的其餘部分。當驗證服務被關閉時,消息將在MSMQ中排隊,並且一旦被提出就會被重新處理。

  • 與上述相同適用於數據庫維護。

1

什麼是validating?在研究排隊策略之前,我會盡可能快地嘗試使validating,包括如果它不是已經如此設置基礎。

+0

我已經使用了基於集合,但我不太清楚你的意思。我已儘可能快地進行驗證(現在每個會話時間爲500毫秒),但如果同時有350名候選人進行驗證,則驗證時間爲175秒。雖然它是負載平衡的,所以實際上它是350/4秒。它的工作原理,但網絡服務器的CPU在幾分鐘內接近100%。 – 2010-03-23 23:02:36

+1

關於數據庫編程使用「基於集合」的操作是當您發出單個數據庫命令(如UPDATE)時它會影響所有行,而不是循環遍歷每行並對每個行執行單獨的UPDATE。我做了一個關於「基於數據庫集處理」的谷歌,這裏有兩篇來自頂端的文章:http://www.codeproject.com/KB/database/SetAndProceduralSQL.aspx和http://weblogs.sqlteam.com/jeffs /archive/2007/04/30/60192.aspx – 2010-03-24 11:33:49

3

如果您沒有使用MSMQ的經驗並且沒有設置基礎架構,我會反對它。當然,這可能是在微軟平臺上排隊的「正確」方式,但它並不是非常直截了當,而且還有相當的學習曲線。

創建Windows服務也是一樣;除非你熟悉它,否則不要這樣做。對於這樣的簡單情況,我會爭辯說,痛苦大於獎勵。

最簡單的解決方案可能是使用該表,並在global.asax中啓動的後臺線程上運行該進程。您可能還希望創建一個管理頁面,該頁面可以報告有關該過程的一些狀態信息(待處理作業的數量等),並且可能還有一個按鈕,以便在出於某種原因失敗時重新啓動該過程。

0

我最近一直在調查這個,所以想提一下我的發現。與您的應用程序相比,數據庫的位置是決定哪個選項更快的重要因素。

我測試了插入100個數據庫條目所花費的時間,並將完全相同的數據記錄到本地MSMQ消息中。然後,我多次進行這個測試的平均結果。

我發現當數據庫位於本地網絡上時,插入一行比登錄到MSMQ的速度快4倍。

當通過體面的互聯網連接訪問數據庫時,向數據庫中插入一行比登錄到MSMQ的速度慢6倍。

因此:

本地數據庫 - DB更快,否則MSMQ是。

+0

我擔保這個意見,我也有同感。 我試圖將100條記錄插入到我自己建築物的網絡中的數據庫中,然後在我的筆記本電腦中創建了Private MSMQ,並做了相同的操作。 MSMQ花費的時間比數據庫多1.5倍以上。 我想MSMQ是好的,當你有多個服務想要在同一個地方寫數據。 – 2017-03-17 10:24:00

+0

我偶然發現了這句話:「在交易模式下,SSB將比MSMQ快得多。如果讓我們以非交易模式(盡力而爲,無序,交付)進行操作,MSMQ將會更快。」那麼......是否可以指定您的測試是使用事務隊列還是未經處理的隊列來執行? – Mario 2017-06-28 11:56:18