2014-08-29 77 views
0

我很新的NserviceBus和我有一個NServiceBus應用程序,處理郵件與創建一個包含不同的命令多個子消息的命令。NServiceBus - 收到錯誤消息時,許多派生子消息

例如,我把消息BulkOrder01放在隊列中,這個隊列被我的BulkOrder消息處理程序拾取。我的BulkOrder01的有效負載包含批量訂單ID,在數據庫中查找時會返回4000個訂單。對於每個子訂單,我都會向訂單發送訂單消息。

這似乎是工作在我們的生產環境不到1000名兒童中的訂單不錯,但一旦我們得到1000以上,我們經常會看到沒有被處理的父消息,因此無法創建子級的消息。

在本地運行它,我發現,它會發送一個或兩個孩子的消息隊列,但隨後會異常與NServiceBus.Unicast.Queing。 FailedToSendMessgeException消息發送失敗來解決:[email protected]」和內部的例外是「System.Messaging.MessageQueueException 無法登記事務

我發現,如果我在EndpointConfig設置DoNotWrapHandlersExecutionInATransactionScope那麼我不會得到例外,直到出現爲父消息超時。我可以通過增加事務超時來防止這種情況。

但是設置DoNotWrapHandlersExecutionInATransactionScope讓我很緊張,我似乎無法找到什麼這實際上做多的信息。顯然它沒有在事務處理範圍中處理執行程序,但是從我已經執行的測試中,它仍然表現爲事務性的,所以如果父消息失敗,那麼沒有任何子消息被髮送。我記得讀到有多層事務處理範圍 - 所以這只是刪除其中的一個層次?

也許這整個方法的繞了錯誤的方式 - 我所知道的傳奇故事存在的NserviceBus內,但沒有真正關心他們,也許我已經描述應該使用佐賀進行的處理...

谷歌搜索異常買了它是一個超時問題,但是我發現只增加它自己的超時只會延遲超時量的異常。它只在本地有效,當我有DoNotWrapHandlersExecutionInATransactionScope集。在產品中,它似乎更可靠地工作,並且僅在大量子消息上失敗。

而且所創建的子級的消息似乎需要相當長的時間被添加到隊列中,約50毫秒,當放大到4000倍的消息是一個總的爲3.3分鐘。這似乎是很長一段時間才能把一條小消息放到隊列上,也許有些東西配置不正確?

我使用實體框架的訪問數據庫和統一運行NServiceBus 4.3.0.0

一個C#4.5的環境我使用IBus.SendLocal發送消息中的依賴注入,我配置超時和設置如下:

NServiceBus.Configure.Transactions.Advanced(x => x.DefaultTimeout(new TimeSpan(0, 5, 0)));

NServiceBus.Configure.Transactions.Advanced(x => x.DoNotWrapHandlersExecutionInATransactionScope());

任何人都可以點我在正確的方向,這就是如果我正確地做這個 - 是預期的緩慢(ish)表現。謝謝。

回答

1

我們有一個類似的過程,所面臨的挑戰是,所有這些工作都包含在您發現的相同事務中。您將需要創建另一個端點來處理您的子訊息。

我會建議在NSB中配置經銷商,並讓經銷商將所有的子處理委託給工人。因此,您可以根據需要擴展對子消息的處理。

+0

感謝您的信息 - 我會看看使用經銷商 – 2014-09-01 09:03:07