2014-01-31 46 views
1

傳統應用程序可能每秒都會向我們的數據庫寫入數據。它可以一次寫入多個條目。每個條目都需要儘快處理,並且需要爲每個條目調用長時間運行的外部Web服務。每秒輪詢一次數據庫並啓動n個長時間運行的任務

我在想最好的架構/模式來處理這個問題:我們需要每秒輪詢數據庫,然後 - 根據新條目的數量 - 啓動這些長時間運行的任務中的n個(被調用的外部Web服務)。這些任務將把結果寫回到遺留應用程序拾取的數據庫中。

我應該「簡單地」使用System.Threading.Tasks和System.Timers.Timer的組合來實現這個,還是有更好的選擇? (基於.Net 4.0 & SQL Server 2008)

更新:我們沒有啓用SQL Server Service Broker,並且理想情況下我想在沒有它的情況下尋求解決方案;至少我認爲這對這項任務來說是一個開銷。但我很樂意被說服。

+0

觸發器或事件通知?爲什麼要輪詢是否有其他選擇? –

+1

@MartinJames會有什麼好處?如果我想要做的事情是儘可能少的額外負載在我們的數據庫服務器上。輪詢應用程序可能位於另一臺服務器上。 – DotNetDeveloper

+0

無論代理運行在何處,都可以在另一臺服務器上觸發事件。優點是沒有輪詢 - 無論是否添加新記錄,本身就是數據庫服務器上的負載的操作,以及刪除檢測附件時的延遲。 –

回答

1

對我來說,更具體的有關實現的:

我會使用Windows服務器查詢數據庫每秒(如您的要求說明)。

然後,我會讓異步WCF,因爲這些可以像你說的那樣長時間運行。

HTH。

1

這個問題引起了對全局設計的更多關注,而不是具體的.net特性。我肯定會在記錄修改時使用觸發器解決方案。爲了避免數據庫加載,該觸發器將只寫入事件的性質:記錄的id,事件類型在單獨的事件表中。輪詢過程將只讀取事件表,並根據需要處理事件並將其存檔以用於統計目的。通過這種方式,您可以控制加載選擇,您可以調整長時間運行的流程以適應您的性能要求,並且您可以掌握所做的一切。我已經建立了一個類似的系統,大約有一億次事件一次到達,沒有任何問題。