2010-03-04 23 views
2

我有一個ASP.NET應用程序在多個IIS6 Web服務器上運行,並帶有SQL Server 2005數據庫後端。選擇一個Web應用程序實例來執行由外部事件觸發的任務?

我需要:

  1. 監控的外部作業事件的完成的數據庫,然後

  2. 恰好有一個Web應用程序實例提交一些信息Web服務

對於(1)它似乎是一個SqlDependency將是最好的方法(或只是普通的舊輪詢)。每個Web應用程序實例在啓動時都會註冊這種依賴關係。 (我不想配置一個'主'實例,因爲該實例的失敗將意味着任務不會繼續,即使其他實例可用。因此,我的設計是確保如果有實例可用(2)我一直在考慮在數據庫中有一些標誌,Web應用程序實例在(1)中收到SqlDependency通知後嘗試更新它們,沿着以下行(大大簡化):

UPDATE StatusTable SET TaskStatus = 1 WHERE TaskStatus = 0 

SELECT @@ROWCOUNT 

的想法是,只有一個應用程序實例將已經能夠更新TaskStatus,並且因此只有一個實例將具有@@ ROWCOUNT> 0。這將該n是'選舉'將信息提交給Web服務的實例。

這種方法的不足之處是什麼?我的其他選擇是什麼? (注意:做這項工作的單獨服務不是一種選擇。)

回答

1

一個全局'旗'將不起作用,請記住你有多個服務員多個通知,你不想要一個服務員'拿起全部通知。爲了可靠挑「只有一個」任務,使用更新與OUTPUT:

UPDATE TOP(1) StatusTable 
    SET Status = 1 
OUTPUT DELETED.TaskId 
WHERE Status = 0; 

這是推薦的,可靠的,這樣出隊作爲隊列從錶行,看到隊列段落OUTPUT Clause

但現在您應該認識到1)您使用表作爲隊列2)您從這些隊列接收通知3)您使用Service Broker傳遞這些通知(通過SqlDependency,其中internally uses Service Broker)。那麼爲什麼不使用普通的Service Broker?您需要一個queueservice,並且每個實例都在此隊列上啓動一個WAITFOR(RECEIVE...)(即而不是輪詢)。感興趣的工作以SEND結束其工作,通知您的工作已完成。您的實例中只有一個會收到此通知並進行後處理(即傳遞Web服務調用)。通過這種方式,您可以刪除通知周圍的所有'fluf'(SqlDependency,全局標誌,用作隊列的表),並且違背SqlDependency將使用的裸架基礎結構。

+0

我不確定我關注...爲什麼會有多個通知?外部事件保證只觸發一次(工作完成後,表中的狀態將會改變)。 在任何情況下,不管上述情況如何,我不知道SQL Server的排隊功能,並明確使用它們似乎更簡單!不幸的是,我不能控制這項工作,所以我將不得不通過與工作擁有者檢查他們是否願意改變事情來確定這是否是真正的選擇,但這當然是理想的解決方案。謝謝。 – rabidpebble 2010-03-05 11:52:22

相關問題