2012-03-22 65 views
1

我們的拓撲結構的快速瀏覽的範圍內:nServiceBus:如何使與數據庫的非事務呼叫從事務性操作

網站發送命令到nServiceBus服務器,它接受了命令,然後發佈正確的pub/sub事件。此服務還具有消息處理程序,可響應命令對數據庫執行一些處理,例如:

1個用戶在網站上註冊 2網站將nServicebus命令發送到另一臺服務器上的nServicebus服務。 3 nServicebus服務器有一個特定類型命令的處理程序,它將某些內容記錄到數據庫併發送歡迎電子郵件

由於構建此體系結構,我們開始在數據庫上發生死鎖。我已將它追溯到數據庫服務器上的MSDTC。如果我把該服務關閉數據庫服務器上nServicebus開始嘔吐起來的錯誤,這對我表明nServiceBus一直爭取在交易數據庫更新。

我不希望這樣的事情發生,我要處理的DB失敗我自己,我只希望交易,以確保郵件傳遞到我的nServicebus代理服務。我不希望通過2臺服務器將數據從網絡傳輸到數據庫並返回。

有什麼建議嗎?

編輯:這篇文章提供了一些線索,但是我不能完全肯定它前進的正確方法.. NServiceBus - Problem with using TransactionScopeOption.Suppress in message handler

EDIT2:我們想要的交易範圍之外的DB工作的原因是,意圖是在另一臺服務器上「異步」處理這些命令,以免減慢網站速度和/或導致用戶等待這些長時間運行的聚合命令。如果數據庫在交易範圍之內,是否在原始命令被髮送給分銷商時阻止了網站上的執行?這種情況下是否有更好的nServicebus架構?我們希望命令迅速火和控制權返回給該網站,以便用戶可以快速地進行,而不必等待我們稍長的運行DB命令,這是更新彙總數和發送電子郵件等

回答

2

我不會建議讓DB在NServiceBus事務的上下文之外工作。相反,請嘗試降低事務的隔離級別。

.IsolationLevel(System.Transactions.IsolationLevel.ReadCommited)

在流利的配置:這可以通過調用來完成。您必須在v2.6中的.MsmqTransport()之後放置這個。在v3.0中,您幾乎可以在任何地方打這個電話。

迴應EDIT2:

只需使用NServiceBus將實現你不會減慢網站的目標,無論交易水平的其他服務器上運行。事務的使用是爲了保證消息在失敗的情況下不會丟失,並且您不必編寫自己的重複數據刪除邏輯。

+0

Thnks你的答案烏迪。你爲什麼不推薦?這些特定的DB命令有點火,但忘記了,如果偶爾不能爲我們工作,那並不重要。我們使用nSvcBus(在這些命令的情況下)只是將工作從Web服務器卸載到另一個服務器的一種方式。 – BoomTownTech 2012-03-22 10:51:21

+0

我們希望數據庫在事務範圍之外工作的原因是,此處的意圖是在另一臺服務器上「異步」處理這些命令,以免減慢網站的速度,從而看到上面的'Edit2' – BoomTownTech 2012-03-22 12:35:21