2010-05-05 95 views
1

讓我首先定義問題以及爲什麼選擇消息隊列。我有一個數據層,它將是事務性的並且極其重要,並且當它們發生時嘗試處理這些問題,我希望從頭開始實現我的應用程序。MSMQ - 消息隊列抽象和模式

我已決定通過使用Microsoft消息隊列來解決這個問題,並執行插入時間允許異步。但是我很快遇到了一個問題。我執行的某些插入操作可能需要立即撤銷(例如:檢索)(想象這是針對POS系統的,如果您需要回憶上次事務 - 還沒有插入事務)會發生什麼情況。

我決定解決這個問題的方法是抽象MessageQueue並將其組合到我的數據訪問層中,從而創建一組返回給數據層用戶的錯覺(我考慮過其他問題發生在這種情況下(即:本質上是髒的閱讀等),並已達成我的目的,我可以控制這些問題)。

然而,這就是事情變得有點討厭...我已經制定了如何找回這些郵件等(瑣碎足夠的問題),但我在哪裏卡住的;我如何創建一個查詢我的消息隊列的通用(或至少有點通用)的方式?我可以最小化SQL查詢和MessageQueue查詢之間的重複。我已經考慮過使用LINQ(但對這項技術的理解非常有限),並且還嘗試使用Predicates實現,目前它們非常難聞。

是否有我可以利用這樣的問題的任何模式?我是否以這種錯誤的方式去做?有沒有人對我如何解決這個問題有任何自己的想法?有人甚至明白我在說什麼嗎? :-)

任何和所有的投入將再次得到高度讚賞並認真考慮...

感謝。

任何有興趣。我在 最終決定在其他位置根本緩存 交易和 使用MSMQ按預期和描述如下 。

回答

1

如果隊列上有大量的消息,那麼枚舉這些消息將成爲嚴重的瓶頸。 MSMQ是爲先入先出類型的訪問而設計的,任何不遵循該模式的東西都會導致你在性能方面產生很大的悲傷。

答案在很大程度上取決於那種你將要執行的查詢,但答案可能是某種非SQL數據庫(或CouchDB的BerkeleyDB的等等)

+0

嗨Codeka的,謝謝你的響應。你能定義「大型」嗎?我的意圖是爲消息隊列運行一個單獨的服務器。這是否以任何方式改變你的迴應? 最後的疑問是這種情況下,我discribing將主要運行沿的線條非常簡單的SELECT語句.. SELECT * FROM RegisterTransactionHeader INNER JOIN RegisterTransactionDetail .... 再次感謝 – 2010-05-05 09:12:16

+0

隊列中的位置並沒有真正影響它。這主要是枚舉所有消息的行爲。與任何與性能有關的東西,很難給出一個難以回答的答案,但我會說如果你有超過100條消息,那麼你很可能會開始注意到它。您還必須考慮到,當您列舉消息時,其他進程將會關閉消息,因此也會使情況複雜化。 – 2010-05-07 01:15:31

相關問題