2008-10-03 72 views
5

我需要以可靠/交易的方式爲外部系統排隊事件和任務。使用像MSMQ或ActiveMQ這樣的東西看起來非常誘人,但事務部分變得複雜(MSDTC等)。交易排隊/出隊

我們可以使用數據庫(SQL Server 2005+,Oracle 9+)並實現更容易的事務支持,但排隊部分變得更醜陋。

這兩條路線看起來都不那麼好,充滿了討厭的陷阱和邊緣情況。

有人可以提供一些實用的指導,在這件事情?

想象一下:E/C/A或計劃任務引擎每隔多久醒來一次,看看是否有任何需要在此時間運行的計劃任務(即下次運行日期已過,但過期日期尚未達成)。

回答

5

我們的系統有60臺電腦,每臺電腦運行12個任務(線程),需要「下一份工作」。總而言之,每天有5萬個「工作」。做每分鐘多少筆交易的數學計算,並且實現任務時間是可變的,因此可以在同一時間獲得多個「流行」事件。

我們有我們的第一個版本使用MSMQ。結論:遠離。雖然它在加載和同步問題方面確實做得很好,但它有兩個問題。一個惱人的和一個交易斷路器。

煩人:作爲企業軟件,MSMQ有安全需求,只是使它成爲與客戶網絡管理員建立和對抗的又一件事。

大忌:然後來到我們要採取下作業的時間,但不能使用簡單的流行,但像「得未來BLUE工作」或「獲得下一個黃色的工作」的東西。不能做到!

我們去計劃B:用一個SQL 2005表實現我們自己的Q. 不能高興

我強調測試它與每天200K郵件,工作。我們可以讓「下一個」邏輯像我們想要的那樣複雜。

問題:你需要非常小心使用下一個項目的SQL。既然你想要它快速和不鎖定。有2個非常重要的SQL 提示我們基於一些研究使用。神奇的事情是這樣的:

SELECT TOP 1 @Id = callid 
FROM callqtbl WITH (READPAST, XLOCK) 
where 1=1 ORDER BY xx,yy 
1

Quartz.Net是一個開源的作業調度系統。

+0

有趣的Oracle特性,我一定要給這次一起來看看。 – chadmyers 2008-10-03 05:58:54

0

是WebSphere MQ(MQ Series)的一個選項嗎?支持交易消息。

+0

可能。其交易處理是否也包括數據庫交易(分佈式交易)?這值得麼? – chadmyers 2008-10-03 05:57:58

+0

這可能是不值得的,因爲它只有郵件系統擁有自己的內部事務處理。如果你還想在get/puts中包含數據庫調用,那麼你也需要MSDTC goo(假設Windows)MQ Series幾乎可以運行在任何東西上:http://www.mqseries.net/phpBB2/index.php – MotoWilliams 2008-10-03 06:05:18

4

我見過MSMQ用於事務處理,它看起來並不特別複雜 - 一個事務SCope將入隊或出隊調用與數據庫訪問一起打包,只要隊列一旦創建就被定義爲事務性。我不認爲ActiveMQ是一個消息代理,但MSMQ安裝在每個端點計算機的本地,因此將事務交易到隊列中並不需要花哨的分佈式事務。

你可能已經意識到這一點,但.NET有一些超過MSMQ(理論上其他傳輸以及)

nServiceBus提供一些不錯的抽象一些輕量級庫:www.nservicebus.com

質量過境:http://code.google.com/p/masstransit/

另外,Oren Eini有一個有趣的,如果基於實驗文件系統的事務性隊列。這個庫的好處是,與MSMQ不同,它可以作爲一個庫部署,而且不需要維護部署MSMQ的麻煩。

你可以閱讀這裏:http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

此外,SQL Server 2005中沒有處理相當排隊優雅,使用SQL Server Service Broker的,但你需要SQL Server將在每個端點安裝的,我不知道SSB是否穿過防火牆。

最後,如果你沒有得到你在這裏尋找的答案,我強烈推薦nSErviceBus討論論壇。 Udi Dahan回答了這些問題以及他的一小部分面向消息的追隨者,這是我迄今發現的最好的資源,可以讓我的隊列導向問題得到快速而有效的回答。那個論壇在這裏:http://tech.groups.yahoo.com/group/nservicebus/

+0

SSB使用配置爲使用UDP端口的端點。因此,可以將防火牆配置爲匹配 – 2008-10-03 09:15:43

1

這就是MSMQ的設計目的 - 排隊交易。如果這不起作用,請查看SQL Server的「Service Broker」功能 - 它是「csmba」在他的答案中描述的「SQL表中的隊列」,但它是一個集成的SQL Server組件,很好地打包並暴露給你使用。