2015-11-04 46 views
3

我知道這對許多人來說似乎相當明顯,但我的客戶正在使用一種我不太方便的模式。我們應該如何處理使用nservicebus的長時間運行過程

情況是,他們的客戶發送通過nservicebus發送到第三方系統的存款或取款。第三方系統需要處理該交易,但交易完成前可能需要幾天甚至幾周的時間。

今天的解決方案是創建一個傳奇,它首先發送一條消息將事務交給第三方系統。完成後,傳奇下一步是檢查完成更新。如果事務未完成,則發送requesttimeout,「等待」。當達到超時時,再次執行相同的檢查,併發送新的requesttimeout ...等等。這一直是一個永恆的循環。它還做了什麼是一次又一次地完全填充同一個SagaTimeout的ServiceInsight。

我一直在尋找單反,但它似乎缺乏。我只需要針對特定​​消息進行多次重試,而不是針對所有消息。

要添加,第三方系統不能發送事務已完成,這意味着我們需要輪詢完成更新。

另外,我相信更好的解決方案是保存交易狀態,將交易發送給第三方並完成這個特殊的事件。然後有一個使用時間間隔檢查完成更新的傳奇。

以這種方式使用sagatimeouts是一種常見模式嗎?而且,有一個傳奇/處理程序只檢查完成更新是一個更好的解決方案嗎?

回答

3

據我所知,你正在按照它應該完成的方式去做。當然,你可以開始一個單獨的傳奇來處理超時,但我沒有看到有任何理由這麼做。

由於您不知道交易/流程何時在第三方系統上完成,因此對最終用戶來說不會非常時間敏感,因此您不需要經常請求超時。您甚至可以統計傳奇數據中超時的次數,並增加下一次超時的時間跨度,以減少超時數量。如果第三方系統已經花費了「太長時間」來完成交易,您還可以檢查該傳奇的運行時間並提醒某人(您或客戶等)。這是NSB傳奇真正閃耀的地方,在處理這些情況時非常靈活。

當然,不要使用單反這種東西,它只是爲了在發生間歇性錯誤時重試處理程序。

0

IMO聽起來像你的傳奇混合了技術問題(輪詢一個外部服務,等待發生的事情)與域問題(希望在事情發生時得到通知)。

我的經驗是,你通常可以從技術性的東西中隔離你的領域的東西,在這種情況下,它可能意味着你應該把投票放在一個集成服務的某個地方,然後當事情發出適當的事件發生。

這樣,傳奇可能會在整個過程中發生超時(例如,檢查過程是否在四周內完成,或者您認爲是在任何人之前必須完成的最長時間),並且只需訂閱TransactionCompleted來自集成服務的事件。

+0

在這種情況下,您是否建議集成服務是一個單獨的端點內的nsb傳奇,基本上只處理超時/輪詢? – Trygve

+0

可能,是的 - 但也許沒有必要使用它的傳奇?投票不能像「System.Timers.Timer」這樣簡單的輪詢一次,並將其發現作爲事件發佈? – mookid8000

+0

這聽起來像mookid8000建議我最初的想法,投票外最初的傳奇。 Trygve說它已經正確實施了。兩者都可以,但是,真正的NServicebus方式是什麼?我最初的想法是,暫停這個傳奇並重新初始化新的遊戲並不是一個好主意......但也許這就是做到這一點的方法 – Per

相關問題